2011-10-13 7 views
37

私はこのクエリを取得し、角括弧内の値を抽出したいと思います。Oracleの正規表現からグループを抽出する方法は?

select de_desc, regexp_substr(de_desc, '\[(.+)\]', 1) 
from DATABASE 
where col_name like '[%]'; 

しかし、[[TEST]]のような角括弧で値がわかります。私はちょうど "テスト"が欲しい。取得するためにクエリを変更するにはどうすればよいですか?

答えて

67

REGEXP_SUBSTR関数の3番目のパラメータは、検索を開始したいターゲット文字列(例ではde_desc)の位置を示します。文字列の指定された部分に一致があると仮定すると、返される内容には影響しません。

Oracle 11gには、関数の6番目のパラメータがあります。これは使用しようとしているもので、返される取得グルー​​プを示しています。適切な使用の例は次のようになります。

SELECT regexp_substr('abc[def]ghi', '\[(.+)\]', 1,1,NULL,1) from dual; 

最後のパラメータ1は返して欲しいキャプチャグループの数を示します。

10gは、このオプションを持っているように見えませんが、あなたのケースであなたが同じ結果を得ることができます:あなたは試合は開始時と終了時に正確に一つの余分な文字を持っているだろうことを知っているので、

select substr(match, 2, length(match)-2) from (
SELECT regexp_substr('abc[def]ghi', '\[(.+)\]') match FROM dual 
); 

。 (あるいは、RTRIMとLTRIMを使用して結果の両端から角括弧を削除することもできます)。

+0

驚くべきことに、6番目のパラメータは、オラクルの公式のREGEXP_SUBSTRドキュメントには記載されていません。存在を指摘してくれてありがとう。 –

14

文字列全体に一致する正規表現パターンを置き換えて使用する必要があります。

select regexp_replace(de_desc, '.*\[(.+)\].*', '\1') from DATABASE; 
+0

IMHOこれは最も簡単で覚えやすく、柔軟性があり、それを行うための最良の方法です。 –

+7

'REGEXP_REPLACE'を使用してキャプチャ・グループを取得する人は、パターンが一致しない場合、Oracleは値全体を返すことに注意したいと思いますが、必要な動作は' null'を返すことです。たとえば、 'REGEXP_REPLACE( 'abcdefghi'、。。* \ [(。+)\]。* '、' \ 1 ')'(パターンが一致しない場合)は 'abcdefghi'を返します。これは一度私を襲った。 – Jared

+0

ここで問題となるのは、Oracle regexpはキャプチャ・グループに一致する文字列の一部を戻す関数を提供していないことです。あなたは再帰的なクエリを使用してみることができます(tab ... by ...から選択...)が、潜在的なパフォーマンスの問題のawre。 – Cyryl1972

関連する問題