最近我在想我们在正则表达式中需要*的原因。例如,如果我们想要表示A0,A1 ..,Z99,我们可以这样做:
[A-Z][0-9][0-9]*
但A0A
(这不是我们想要的)根据以上内容也是有效的。 *给我带来了什么好处?
答案 0 :(得分:3)
*
只是一个量词,在零和无限时间之间匹配。
[A-Z][0-9][0-9]*
匹配A0,A1 ..,Z99以及A10000,Z123456789 ......
请记住,如果您不将^
和$
作为锚点,处理器将匹配指定的部分,并返回true
即使输入包含更多字符,因为您不要如果整个输入与正则表达式匹配,那么你只想要一个肯定的结果。
如果你的目标只是匹配A0,A1 ..,Z99,那么正则表达式应该是:
^[A-Z][0-9][0-9]?$
或者简单地说:
^[A-Z]\d{1,2}$
\d
表示“数字”,与[0-9]
相同。
{1,2}
表示至少1次,不超过2次。
?
也是一个量词,匹配0或1次。
答案 1 :(得分:1)
但是A0A(我们不想要的)也是有效的
不,它无效,你只需要使用锚点:
^[A-Z][0-9][0-9]*$
^
将确保在开始时匹配,$
确保匹配到行结束。
此外,如果只有第二位数字是可选的,那么最好使用:
^[A-Z][0-9][0-9]?$
由于*
匹配0次或更多次,而?
匹配0或1次。
答案 2 :(得分:0)
好像你试图用大写字母匹配字符串开头,以下数字的范围是1到99.
^[A-Z][1-9]?[0-9]$
^
断言我们刚开始,$
声称我们已经结束了。所以这有助于进行精确的字符串匹配。它不会在字符串或行的中间或开头或结尾处匹配。也就是说,[A-Z][1-9]?[0-9]
将与A10
字符串中的fooA10
匹配,但^[A-Z][1-9]?[0-9]$
不会在fooA10
字符串中生成匹配。