首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Postgres星号量词不起作用

Postgres星号量词不起作用
EN

Stack Overflow用户
提问于 2016-04-08 10:14:25
回答 1查看 245关注 0票数 1

在Postgres 9.5.1中,以下命令工作:

代码语言:javascript
运行
复制
select regexp_replace('JamesBond007','\d+','');

输出:

代码语言:javascript
运行
复制
JamesBond

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

代码语言:javascript
运行
复制
select regexp_replace('JamesBond007','\d*','');

它产生:

代码语言:javascript
运行
复制
JamesBond007

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

代码语言:javascript
运行
复制
select regexp_replace('JamesBond007','\d+','008');

在以下方面的成果:

代码语言:javascript
运行
复制
JamesBond008

代码语言:javascript
运行
复制
select regexp_replace('JamesBond007','\d*','008');

还给我:

代码语言:javascript
运行
复制
008JamesBond007

Postgres文档表示*=原子的0或多个匹配序列。这是怎么回事?(注:在Oracle中,上述所有工作按预期进行)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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位数字。否则,为什么首先删除字符串中不存在的内容?

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36497031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档