2

regexp_replace を使用して別の文字列の末尾に文字列を連結するときに、regexp_replace を使用してそれを行う演習として、予期しない結果を見つけました。理由を理解するだけでなく、このおそらく予期しない結果を人々に知らせるために、私はそれを持ち出します.

文字列 "Note 1" の末尾に "note 2" を追加することを意図しているこのステートメントを考えてみましょう。私の意図は、行全体をグループ化し、新しい文字列を最後に連結することでした:

select regexp_replace('note 1', '(.*)', '\1' || ' note 2') try_1 from dual;

しかし、結果を見てください:

TRY_1               
--------------------
note 1 note 2 note 2

ノートが 2 回繰り返されます。なんで?

行頭アンカーと行末アンカーを含むようにパターンを変更すると、期待どおりに動作します。

select regexp_replace('note 1', '^(.*)$', '\1' || ' note 2') try_2 from  dual;

TRY_2        
-------------
note 1 note 2

なぜそれが違いを生む必要があるのですか?

編集: 以下の Politank-Z の説明を参照してください。最初の例を変更して、アスタリスク (前の文字の 0 回以上の出現) ではなくプラス (前の文字の 1 回以上の出現に一致) を使用するように変更した場合、追加したいと思いました。期待どおりに機能します。

select regexp_replace('note 1', '(.+)', '\1' || ' note 2') try_3 from dual;

TRY_3        
-------------
note 1 note 2
4

1 に答える 1

3

Oracleドキュメントに従って:

デフォルトでは、この関数は source_char を返し、正規表現パターンが出現するたびに replace_string に置き換えます。

そこにある鍵は、すべての出来事です。.*空の文字列と一致し、Oracle 正規表現エンジンは最初に文字列全体と一致し、次に次の空の文字列と一致します。アンカーを追加すると、これがなくなります。または、リンクされたドキュメントごとに発生パラメーターを指定することもできます。

于 2015-04-06T14:37:30.127 に答える