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中注意以上所有工作如预期的那样)
事情是,\d*可以匹配一个空字符串,你没有传递标志g.
flags参数是一个可选的文本字符串,包含零个或多个单字母标志,用于更改函数的行为.Flag
i指定不区分大小写的匹配,而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.
通常,在基于正则表达式的替换函数/方法中使用匹配空字符串的模式时应该谨慎.只有当你明白自己在做什么时才这样做.如果您想要替换数字,您通常希望找到至少1位数.否则,为什么要首先删除字符串中不存在的内容?