为什么此正则表达式与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
答案 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 之后。仅在前两种情况不匹配时才尝试这种情况。对于3a
,3
已经与第二种情况匹配,因此不会考虑最后一种情况。
您似乎只想要
^(\d{1,4}[A-Za-z]|\/?\d{1,4})
请注意,原始正则表达式中的\/\d{1,4}
情况和\d{1,4}
情况是如何合并为一个情况的\/?\d{1,4}
。