解释意外的regexp_replace结果

时间:2015-04-06 14:27:46

标签: sql regex oracle oracle11g regexp-replace

当使用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

1 个答案:

答案 0 :(得分:3)

根据Oracle Documentation

  

默认情况下,该函数会在每次出现时返回source_char   正则表达式模式替换为replace_string。

关键是每次出现.*匹配空字符串,Oracle regexp引擎首先匹配整个字符串,然后是以下空字符串。通过添加锚点,您可以消除这种情况。或者,您可以根据链接的文档指定出现参数。