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
以前、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
コメント