首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个regex (见内)与24+匹配?(以及如何匹配确切的模式)

为什么这个regex (见内)与24+匹配?(以及如何匹配确切的模式)
EN

Stack Overflow用户
提问于 2016-06-29 13:12:44
回答 2查看 50关注 0票数 0

这是大政方针:

(0-1)\x{e76f}20-3

目标:匹配号码:0到23

(工作版本:

(0-1?)\x{e76f}20-3

)

第一个版本的问题(0-9\x{e76f}(0-1)\20-3):

对我来说,这意味着:匹配这些数字(或包含它们的字符串/数字)

  • 0,....,9
  • 01 .,09
  • 10,.,19
  • 20,. 23

但它也与24相匹配。为什么?

我还尝试(与精确的模式相匹配,而不是潜在的超集):

  • 在模式开始和结束时使用\b。结果:匹配0到10只匹配
  • 使用^(开始)+$(结束)但使用20、21、.不匹配吗

http://regexr.com/中尝试

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-29 13:18:49

因为你不用锚。试一试

代码语言:javascript
复制
^([0-9]|([0-1][0-9])|2[0-3])$

在regex101这里见

不过,可以略为简化:

代码语言:javascript
复制
^(1?\d|2[0-3])$

它测试整个字符串-- ^匹配开头,$匹配结束。然后,它在一个组中有两个选择(被()包围)-首先是一个可选的 1,后面是任何数字(句柄0-19)。其他选项匹配一个2,后面是0-3 (句柄20-23)。

它稍微简单一些,,但是它不允许前导零,所以如果你需要的话,它必须是

代码语言:javascript
复制
^([01]?\d|2[0-3])$`
票数 2
EN

Stack Overflow用户

发布于 2016-06-29 14:38:21

您似乎误解了RegExr显示为匹配的内容。

考虑到示例文本24

  1. 或者激活全局标志g,这将产生两个匹配(此标志告诉regex引擎继续匹配并返回文本中的所有其他匹配数字)
  2. 或者,您忽略了您的模式仍然与部分文本匹配,因为2是匹配的,即使它后面跟着一个4

因此,如果您希望程序拒绝表示超出范围0、23的数字的字符串,则必须扩展模式,使其不再接受在指定数字之后的数字。

例如,您可以使用分别与字符串的开始和结束匹配的锚点^$

代码语言:javascript
复制
^([0-9]|([0-1][0-9])|2[0-3])$
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38100675

复制
相关文章

相似问题

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