作为使用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
根据Oracle文档:
默认情况下,该函数返回source_char,每次出现的正则表达式模式都替换为replace_string。
关键在于 每一次发生 。.*匹配空字符串,Oracle regexp引擎首先匹配整个字符串,然后匹配以下空字符串。通过添加锚点,可以消除这种情况。或者,您可以根据链接的文档指定出现参数。
.*