首页 > 解决方案 > 为什么这个正则表达式不匹配数字和单个字母?

问题描述

为什么这个正则表达式不匹配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

标签: rubyregex

解决方案


由于您的模式中的替代顺序,数字+字母组合不匹配。\d{1,4}?匹配字母前的数字,甚至\d{1,4}[A-z]{1}没有机会介入。请参阅记住正则表达式引擎是急切的文章。

\/\d{1,4}?匹配/斜杠后的一个和一个数字,并且\d{1,4}?总是匹配一个数字,就像{min,max}?一个惰性范围/间隔/限制量词一样,因此只匹配尽可能少的字符。请参阅懒惰而不是贪婪

另外,[A-z]是笔误,应该是[A-Za-z]

看来你想要

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

请参阅正则表达式演示。如果它应该在一行的开头,请使用

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

请参阅此正则表达式演示

细节

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

推荐阅读