在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个数字。否则,为什么要首先删除字符串中不存在的内容?