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