• ベストアンサー

oracleで正規表現を使用して文字列操作

regexp_substr、regexp_replaceなどを使って、カンマくぐりの文字列を 文字列の編集編集、部分文字列を取り出し、文字列の置換をしています。 要は、先頭、2番目、3番目、・・・・、最後と、そのカンマで区切られた 値をそれぞれ取り出したいのですが、どうしてもカンマが残ってしまいます。 以下、実際試したことです。 先頭 select regexp_substr('aaa,bbb,ccc,ddd','(^[^,]+)') from dual; select regexp_substr(',aaa,bbb,ccc,ddd','(^,[^,]+)') from dual; 最後 select regexp_substr('aaa,bbb,ccc,ddd',',([^,]+)$') from dual; select regexp_substr(',aaa,bbb,ccc,ddd',',([^,]+)$') from dual; 中間 select regexp_substr('aaa,bbb,ccc,ddd',',([^,]+)',1) from dual; select regexp_substr('aaa,bbb,ccc,ddd',',([^,]+)',1,2) from dual; select regexp_substr(',aaa,bbb,ccc,ddd',',([^,]+)',1,2) from dual; select regexp_substr(',aaa,bbb,ccc,ddd',',([^,]+)',1,3) from dual; 良い方法ないでしょうか。 また、regexp_replaceでも実現したいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.1

最終目標がどのようなものなのかわかっていませんが、 単純に、何番目を取り出す、と言うのでは何か問題があるのでしょうか。 SELECT regexp_substr('aaa,bbb,ccc,ddd', '[^,]+', 1, 1) FROM dual;/* 1番目 */ SELECT regexp_substr('aaa,bbb,ccc,ddd', '[^,]+', 1, 2) FROM dual;/* 2番目 */ SELECT regexp_substr('aaa,bbb,ccc,ddd', '[^,]+', 1, 3) FROM dual;/* 3番目 */ SELECT regexp_substr('aaa,bbb,ccc,ddd', '[^,]+', 1, 4) FROM dual;/* 4番目 */

abc999xyz
質問者

お礼

ありがとうございます。 問題ありません。 何番目を指定せずに取り出せたらと思った次第ですが、問題ありません。

Powered by GRATICA

その他の回答 (1)

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.2

何番目を指定せずにと言う事でしたらこのような方法があるのですが、カンマで区切ったものが行になってしまうので、列として取得するには何かしらの工夫が必要です。 以下の例では、区切ったものの個数を最大4(LEVEL <= 4)として想定しているので、カンマの数に合わせて調整してみてください。 SELECT regexp_substr('aaa,bbb,ccc,ddd', '[^,]+', 1, LEVEL) FROM dual CONNECT BY LEVEL <= 4

abc999xyz
質問者

補足

ありがとうございます。 検索の開始位置や検知回数を使わずに正規表現パターンできないかと思った次第です、。 regexp_replaceで置換できないかと思った次第です。 折角、機能があるのに使わない方がと思いました。

関連するQ&A