admin

说明意外的regexp_replace结果

sql

作为使用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

阅读 158

收藏
2021-06-07

共1个答案

admin

根据Oracle文档

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

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

2021-06-07