解释意外 regexp_replace 结果

Explain unexpected regexp_replace result

我在使用 regexp_replace 将一个字符串连接到另一个字符串的末尾时发现了一个意想不到的结果,作为使用 regexp_replace 进行此操作的练习。我提出它不仅是为了找出原因,也是为了让人们知道这个可能出乎意料的结果。

考虑此语句,其目的是将 "note 2" 添加到字符串 "Note 1" 的末尾。我的意图是将整行分组,然后将新字符串连接到末尾:

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

但是看看结果:

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

注释重复了两次!为什么?

如果我更改模式以包含行首和行尾锚点,它会按预期工作:

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

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

为什么会有所不同?

编辑:请参阅下面 Politank-Z 的解释。如果我将第一个示例更改为使用加号(匹配前一个字符出现 1 次或多次)而不是星号(匹配前一个字符出现 0 次或多次),我想添加它按预期工作:

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

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

根据 Oracle Documentation:

By default, the function returns source_char with every occurrence of the regular expression pattern replaced with replace_string.

这里的关键是每次出现.* 匹配空字符串,Oracle 正则表达式引擎首先匹配整个字符串,然后是后面的空字符串。通过添加锚点,您可以消除它。或者,您可以根据链接文档指定出现参数。