【问题标题】:Why does this regex not match numbers and single letters?为什么这个正则表达式不匹配数字和单个字母?
【发布时间】:2018-07-18 07:45:26
【问题描述】:

为什么这个正则表达式不匹配3a

(\/\d{1,4}?|\d{1,4}?|\d{1,4}[A-z]{1})

使用\d{1,4}\D{1},结果是一样的。

街道编号:

/1
78
3a
89/
-1 (special case)
1

https://regex101.com/r/cYCafR/3

【问题讨论】:

标签: ruby regex


【解决方案1】:

由于您的模式中的替代顺序,数字+字母组合不匹配。 \d{1,4}? 匹配字母前的数字,\d{1,4}[A-z]{1} 甚至没有机会介入。请参阅Remember That The Regex Engine Is Eager 文章。

\/\d{1,4}? 将匹配 / 和斜线后的单个数字,而 \d{1,4}? 将始终匹配单个数字,因为 {min,max}? 是一个 惰性 范围/间隔/限制量词,因此只匹配尽可能少的字符。见Laziness Instead of Greediness

另外,[A-z] is a typo,应该是[A-Za-z]

看来你想要

\d{1,4}[A-Za-z]|\/?\d{1,4}

请参阅regex demo。如果它应该在行首,请使用

 ^(?:\d{1,4}[A-Za-z]|\/?\d{1,4})

看到这个regex demo

详情

  • ^ - 行首
  • (?: - non-capturing group 的开始
    • \d{1,4}[A-Za-z] - 1 到 4 位数字和一个 ASCII 字母
    • | - 或
    • \/? - 可选/
    • \d{1,4} - 1 到 4 位数字
  • ) - 小组结束。

【讨论】:

  • 实际上 A-z 来自一个街道地址正则表达式,来自堆栈溢出一些用户示例。我没有时间再次搜索它,但是,感谢您的时间和有用的链接!
  • @MysteriousNothing 这是一个很常见的错字,它甚至出现在一些在线的正则表达式教程中。只有一个环境,[A-z] 可以按预期工作,但肯定不是 Ruby。
  • @MysteriousNothing 很多代码都包含错误。仅仅因为您在互联网上的某个地方找到了代码,这并不正确;)
  • @TomLord 但是,但是,它在堆栈溢出并且投票赞成:D [A-z] 部分在那里,其他是我自己的愚蠢。
  • @MysteriousNothing 你一定在谈论this post。阅读更新。尽管发布答案的用户应该在顶部更新解决方案,而不是在该副标题下方写一些东西。
【解决方案2】:

您的正则表达式使用惰性量词,例如 {1,4}?。这些将匹配一个字符并停止,因为模式的其余部分(即没有)与字符串的其余部分匹配。请参阅 here 了解贪婪量词与惰性量词的工作原理。

另一个原因是您将\d{1,4}[A-z]{1} 的情况放在最后。仅当前两个案例不匹配时才会尝试此案例。使用3a3 已经匹配第二种情况,因此不会考虑最后一种情况。

你似乎只是想要:

^(\d{1,4}[A-Za-z]|\/?\d{1,4})

注意原始正则表达式中的\/\d{1,4} 大小写和\d{1,4} 大小写如何合并为一个大小写\/?\d{1,4}

【讨论】:

  • 我有很多东西要学,对像我这样的初学者很有帮助的文章,非常感谢您抽出宝贵的时间!
  • @MysteriousNothing 如果您认为答案回答了您的问题,请考虑选择您认为最好的答案并点击该复选标记接受它!
  • 两个答案都很有帮助和提示,并且有有用的提示,所以我选择谁先发帖。我希望没有难过的感觉。 :)
  • 神秘的,我对你选择授予绿色的人没有评论,但我认为没有理由与答案的时间戳有任何关系。如果有人问你更喜欢两种披萨中的哪一种,你会先吃哪个?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 2018-08-24
  • 1970-01-01
  • 2011-09-17
  • 2018-10-11
  • 1970-01-01
相关资源
最近更新 更多