2017-03-17 18 views
-2

正確な文字列の連続する桁数を置き換えたい。これは、数字の長いシーケンスの一部であるオカレンスを置き換えることを望まないということを意味する。例えば正規表現正確な桁数に一致する

select regexp_replace('filename07_20160723', '[0-9]{2}', '') from dual 

戻り

filename_ 

が、私はそれが私はそれが数字以外の文字が含まれている(だけ孤独'07'交換するにはどうすればよい

filename_20160723 

を返すようにしたいですいずれかの側に)?

+0

あなたの正規表現は、2桁の2桁の数字に一致します。アンダースコアの前に2桁の数字、またはアルファベットの後に2桁の数字を表示することはできますか? – mustaccio

+0

「一定の金額」と「正確な金額」 - あなたはそれが何であるか教えてください。または、それらが変わることがありますか?そうであれば、どのようにそれらを「問い合わせ」に伝えていますか?) – mathguy

答えて

0

Oracleは正確 2桁(桁両側なし)を置き換えるために、ルックアラウンドをサポートしていないため、非数字に両側をキャプチャし、それらを元に戻す:

regexp_replace('filename07_20160723', '(\D)\d\d(\D)', '\1\2') 

注: @mathguypoints outとすると、いずれの側の非数字文字も消費されるため、別の一致に参加することはできません。 'y'は二桁のペアで試合を許可するように再び参加することはできませんので

x33y44z -> xy44z not xyz 

:これは、次のような効果があります。

+0

ありがとう、これはまさに私が求めていたものです。私はあなたがしたことを理解しています。 ([^ 0-9])は?また、 '\ 1 \ 2'がなければこれは何のためにも機能しないようです。前もって感謝します! – DUzvalok

+0

私が正しく理解していれば、([^ 0-9])を(\ D)に置き換えることができますか?まだ\ '\ 2 \'によって混乱しています – DUzvalok

+0

要件はまだ明確ではありませんが、あなたが与えた理由のために、この解決法はうまくいかない可能性があります。 REGEXP_REPLACEはすべてのオカレンスを置き換えますが、 "ルックアラウンド"の問題のために、すべてのオカレンスにはなりません。この解決策は 'a00bc00d'をとり、 'abcd'を返しますが、 'a00b00d'と 'ab00d'を返します。 OPは、要件が何であるかに関係なく、これらの結果の両方を望んでいるとは考えにくい。 – mathguy

関連する問題