Postgres asterisc正则表达式量词不起作用

时间:2016-04-08 10:14:25

标签: regex postgresql quantifiers

在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中所有上述工作都按预期工作)

1 个答案:

答案 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位数的数字。否则,为什么要首先删除字符串中不存在的东西?