为什么此正则表达式不匹配数字和单个字母?

时间:2018-07-18 07:45:26

标签: ruby regex

为什么此正则表达式与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

2 个答案:

答案 0 :(得分:3)

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

\/\d{1,4}?将匹配/和斜线后的一位数字,而\d{1,4}?将始终匹配一位数字,因为{min,max}? lazy range / interval / limiting量词,因此只能匹配尽可能少的字符。参见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位数字
  • )-组末尾。

答案 1 :(得分:1)

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

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

您似乎只想要

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

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