当使用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
为什么会有所作为?
编辑:请参阅Politank-Z的解释如下。我想添加,如果我将第一个示例更改为使用加号(匹配前一个字符的1个或多个匹配项)而不是星号(对于前一个字符的0次或更多次出现),它按预期工作:select regexp_replace('note 1', '(.+)', '\1' || ' note 2') try_3 from dual;
TRY_3
-------------
note 1 note 2
答案 0 :(得分:3)
默认情况下,该函数会在每次出现时返回source_char 正则表达式模式替换为replace_string。
关键是每次出现。 .*
匹配空字符串,Oracle regexp引擎首先匹配整个字符串,然后是以下空字符串。通过添加锚点,您可以消除这种情况。或者,您可以根据链接的文档指定出现参数。