Postgres asterisc regex量词不起作用



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

相关内容

  • 没有找到相关文章

最新更新