在Postgres 9.5.1中,以下命令有效:
select regexp_replace('JamesBond007','\d+','');
输出:
JamesBond
然而,asterisc似乎不起作用:
select regexp_replace('JamesBond007','\d*','');
它产生:
JamesBond007
当我把一些东西作为替换字符串时,会发生更奇怪的事情:
select regexp_replace('JamesBond007','\d+','008');
结果:
JamesBond008
,而
select regexp_replace('JamesBond007','\d*','008');
让我回来:
008JamesBond007
Postgres文档说* =原子的0或更多匹配的序列。 那么这里发生了什么? (N.B.在Oracle中所有上述工作都按预期工作)
答案 0 :(得分:5)
问题是\d*
可以匹配一个空字符串而你没有传递标记g
。
请参阅regexp_replace
:
flags参数是一个可选的文本字符串,包含零个或多个单字母标志,用于更改函数的行为。标记
i
指定不区分大小写的匹配,而标记g
指定替换每个匹配的子字符串,而不是仅指定第一个。
\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位数的数字。否则,为什么要首先删除字符串中不存在的东西?