oracleで正規表現でデータを抜きだす2 REGEXP_REPLACE


以前、REGEXP_REPLACEを使ってデータを抜き出す方法を作ったのですが、
最短マッチにしていなかったため、こんな現象が起きました。

DATA
xxx(aaa)xxx(bbb)xxx

SQL
select REGEXP_REPLACE(DATA,'.*\((.+?)\).*','\1') from dual

結果
bbb

最初の.*の指定が最長マッチになっていたため、
後方のデータを取ってくる形になっていました。

カッコ内は最短になっていたので、
aaaxxxbbbみたいにならなかったので余計気が付かなかった形でした。

そこで、頭の部分を最短マッチにした結果、
今度は括弧だけ外れて、

aaaxxxbbbxxx
みたいな状態になりました。

直前のパターン数を0以上にすると、思った形にならないことが判明。

ということで以下のようにしました。


select REGEXP_REPLACE(DATA,'.+?\((.+?)\).*','\1') from dual

これで解決。



参考:
http://www-creators.com/archives/1804