在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');还给我:
008JamesBond007Postgres文档表示*=原子的0或多个匹配序列。这是怎么回事?(注:在Oracle中,上述所有工作按预期进行)
发布于 2016-04-08 10:19:57
问题是,\d*可以匹配空字符串,而不是传递标志g。
请参阅http://www.postgresql.org/docs/9.4/static/functions-matching.html#FUNCTIONS-POSIX-REGEXP
标志参数是一个可选的文本字符串,包含零个或多个单字母标志,这些标志可以更改函数的行为。标志
i指定不区分大小写的匹配,而标志指定替换每个匹配的子字符串,而不仅仅是第一个。
\d*匹配JamesBond007字符串开头的空位置,并且由于g未被传递,当您使用select regexp_replace('JamesBond007','\d*','008');时,该空字符串将被008替换,并且结果是预期的- 008JamesBond007。
使用select regexp_replace('JamesBond007','\d*','');,\d*再次匹配字符串开头的空位置,并将其替换为空字符串(没有任何可见的更改)。
请注意,默认情况下,甲骨文的https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm将替换所有出现的事件:
默认情况下,函数返回
source_char,并将正则表达式模式替换为replace_string。
在一般的中,在使用匹配基于regex的替换函数/方法中的空字符串的模式时应该谨慎。只有当你明白自己在做什么时,才去做。如果要替换数字,通常需要找到至少1位数字。否则,为什么首先删除字符串中不存在的内容?
https://stackoverflow.com/questions/36497031
复制相似问题