在使用 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
音符重复两次!为什么?
如果我将模式更改为包含行首和行尾锚点,它将按预期工作:
select regexp_replace('note 1', '^(.*)$', '\1' || ' note 2') try_2 from dual;
TRY_2
-------------
note 1 note 2
为什么要有所作为?
编辑:请参阅下面的 Politank-Z 的解释。我想补充一下,如果我将第一个示例更改为使用加号(匹配前一个字符的 1 次或多次出现)而不是星号(前一个字符的 0 次或多次出现),它按预期工作:
select regexp_replace('note 1', '(.+)', '\1' || ' note 2') try_3 from dual;
TRY_3
-------------
note 1 note 2