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

abs*_*urd 1 regex postgresql quantifiers

在Postgres 9.5.1中,以下命令有效:

select regexp_replace('JamesBond007','\d+','');
Run Code Online (Sandbox Code Playgroud)

输出:

JamesBond
Run Code Online (Sandbox Code Playgroud)

然而,星号似乎不起作用:

select regexp_replace('JamesBond007','\d*','');
Run Code Online (Sandbox Code Playgroud)

它产生:

JamesBond007
Run Code Online (Sandbox Code Playgroud)

当我把一些东西作为替换字符串时,会发生更奇怪的事情:

select regexp_replace('JamesBond007','\d+','008');
Run Code Online (Sandbox Code Playgroud)

结果是:

JamesBond008
Run Code Online (Sandbox Code Playgroud)

select regexp_replace('JamesBond007','\d*','008');
Run Code Online (Sandbox Code Playgroud)

让我回来:

008JamesBond007
Run Code Online (Sandbox Code Playgroud)

Postgres文档说*=原子的0或更多匹配的序列.那么这里发生了什么?(在Oracle中注意以上所有工作如预期的那样)

Wik*_*żew 5

事情是,\d*可以匹配一个空字符串,你没有传递标志g.

regexp_replace:

flags参数是一个可选的文本字符串,包含零个或多个单字母标志,用于更改函数的行为.Flag i指定不区分大小写的匹配,而flag 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.

通常,在基于正则表达式的替换函数/方法中使用匹配空字符串的模式时应该谨慎.只有当你明白自己在做什么时才这样做.如果您想要替换数字,您通常希望找到至少1位数.否则,为什么要首先删除字符串中不存在的内容?