2017-10-03 3 views
1

2文字以上の区切り文字を使用して文字列を検索したいとします。REGEXP SUBSTR区切り文字は2文字以上の組み合わせです

クエリを見つけてください、私は以下試してみました:

select REGEXP_SUBSTR('[email protected][email protected]','[^[email protected]]+',1,2) from dual 

必要な出力:

45$6 

出力:

45 

私はそれが容易に可能であることを理解使用しているユーザ定義された関数[INSTR + SUBSTRと]しかし、私はREGEXP_SUBSTRと答え&の説明を探しています。

ありがとうございます。むしろ

ような

答えて

3

ない...:コード内

select REGEXP_SUBSTR('[email protected][email protected]','(.*?)(\[email protected]|$)', 1, 2, null, 1) from dual; 

お知らせ\$$は文字列の終わりを意味するので、リテラルドル記号を意味する場合は、それをエスケープする必要があります。このソリューションでは、「キャプチャ・グループ」という概念を使用しています。使い慣れていない場合は、OracleのドキュメントREGEXP_SUBSTR()を参照してください。最初のキャプチャグループは(.*?) - 区切り文字の前に来るものは何でも構いません。 REGEXP_SUBSTRの6番目(最後)の引数で参照されます。

通知はまた、その最初のキャプチャグループの後に私は$でマークされた2文字の区切りまたは文字列の終わり...のいずれかをチェックします。かっこで囲まれ、|(別の "特殊文字")で区切られた2つのオプションは、 "どちらか...または..."の正規表現構文です。

+0

ありがとうございました。私の理解が正しいなら助言してください。 '(。*?)':ドットは任意の文字のためのものであり、*は0以上の任意の文字の出現のためのものですが、そこに置いておくと貪欲な検索になり、文字列の終わりまですべてを取得します。したがって、 '?'は検索を非貪欲にし、区切り文字の再帰を見つける最初の点で停止することです。最後に区切られた値を得るために、特殊文字をエスケープし、最後の文字列をエスケープするというヒントをありがとう。 – pOrinG

+0

"貪欲"対 "非貪欲"(または "怠惰")マッチングの理解はまさに正しいです。 ([^;] + 'のような)使用したいトリックを使用することはできないので、非セミコロン(または一文字の区切り文字)の途切れのない部分文字列だけを検索し、代わりに本当に'を使用する必要があります。 * 'または'。+ 'を使うと、貪欲でない検索を使わなければならない(MUST)。 '*'ではなく '+'の弱点にも注意してください。 - 2つの区切り文字がすぐ隣にある場合は、NULLを表す必要があります。 +演算子を使うと完全にそれらを逃すでしょう。 *演算子もそれらをキャッチします。 – mathguy

+0

「+」と「*」の弱さが私を本当に驚かせました。それのために問題を経験していない限り、それについて考えなかったでしょう。感謝します。 – pOrinG

関連する問題