在Postgres 9.5.1中,以下命令有效:
select regexp_replace('JamesBond007','d+','');
输出:
JamesBond
然而,星号似乎不起作用:
select regexp_replace('JamesBond007','d*','');
它产生:
JamesBond007
当我把一些东西作为替换字符串时,会发生更奇怪的事情:
select regexp_replace('JamesBond007','d+','008');
结果在:
JamesBond008
而
select regexp_replace('JamesBond007','d*','008');
还给我:
008JamesBond007
Postgres文档中说*=原子的0个或多个匹配的序列。那么这里发生了什么?(注意:在Oracle中,所有上述工作均按预期进行)
问题是d*
可以匹配一个空字符串,而您没有传递标志g
。
参见regexp_replace
:
flags参数是一个可选的文本字符串,包含零个或多个更改函数行为的单字母标志。标志
i
指定不区分大小写的匹配,而标志g
指定替换每个匹配的子字符串,而不是仅替换第一个子字符串。
d*
与JamesBond007
字符串开头的空位置匹配,并且由于未传递g
,因此当使用select regexp_replace('JamesBond007','d*','008');
时,该空字符串将替换为008
,并且预期结果为008JamesBond007
。
对于select regexp_replace('JamesBond007','d*','');
,d*
再次匹配字符串开头的空位置,并将其替换为空字符串(没有可见的更改)。
请注意,Oracle的REGEXP_REPLACE
默认情况下会替换所有出现的内容:
默认情况下,函数返回
source_char
,每次出现正则表达式模式时都用replace_string
替换。
通常,在基于正则表达式的替换函数/方法中使用与空字符串匹配的模式时应谨慎。只有当你明白自己在做什么的时候才去做。如果要替换数字,通常需要查找至少1个数字。否则,为什么要删除字符串中不存在的内容?