Я обнаружил неожиданный результат при использовании regexp_replace для объединения строки в конце другой строки в качестве упражнения по использованию regexp_replace для этого. Я поднимаю его не только для того, чтобы выяснить, почему, но и для того, чтобы сообщить людям об этом, возможно, неожиданном результате.
Рассмотрим это утверждение, в котором намерение состоит в том, чтобы прикрепить «примечание 2» к концу строки «примечание 1». Я намеревался сгруппировать всю строку, а затем объединить новую строку до конца:
select regexp_replace('note 1', '(.*)', '\1' || ' note 2') try_1 from dual;
Но посмотрите на результат:
TRY_1
--------------------
note 1 note 2 note 2
Примечание повторяется дважды! Почему?
Если я изменю шаблон, включив в него привязки начала и конца строки, он будет работать, как ожидалось:
select regexp_replace('note 1', '^(.*)$', '\1' || ' note 2') try_2 from dual;
TRY_2
-------------
note 1 note 2
Почему это должно иметь значение?
РЕДАКТИРОВАТЬ: см. Объяснение Политанка-Z ниже. Я хотел добавить, что если я изменю первый пример, чтобы использовать плюс (соответствует 1 или более вхождений предыдущего символа), а не звездочку (для 0 или более вхождений предыдущего символа), он будет работать, как ожидалось:
select regexp_replace('note 1', '(.+)', '\1' || ' note 2') try_3 from dual;
TRY_3
-------------
note 1 note 2