在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个或多个匹配项的序列。
那这里发生了什么?(注意:在甲骨文中,上述所有工作均按预期进行)

最佳答案

问题是\d*可以匹配一个空字符串,而您没有传递标志g
regexp_replace
flags参数是一个可选文本字符串,包含零个或多个更改函数行为的单字母标志。Flagi指定不区分大小写的匹配,而Flagg指定替换每个匹配的子字符串,而不是仅替换第一个子字符串。
\d*JamesBond007字符串开头的空位置匹配,并且由于未传递g,因此当您使用008时,该空字符串将替换为select regexp_replace('JamesBond007','\d*','008');,结果是预期的-008JamesBond007
使用select regexp_replace('JamesBond007','\d*','');,再次,\d*匹配字符串开头的空位置,并将其替换为空字符串(无可见更改)。
请注意,默认情况下,Oracle的REGEXP_REPLACE将替换所有出现的事件:
默认情况下,函数返回source_char,正则表达式模式的每次出现都被replace_string替换。
一般来说,在基于regex的替换函数/方法中使用与空字符串匹配的模式时,应该小心。只有当你明白自己在做什么的时候才去做。如果要替换数字,通常需要找到至少1个数字。否则,为什么要首先删除字符串中不存在的内容?

10-08 14:35