2

在使用 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
4

1 回答 1

3

根据Oracle 文档

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

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

于 2015-04-06T14:37:30.127 回答