在正则表达式中有*的重点是什么

时间:2015-03-17 13:34:59

标签: regex

最近我在想我们在正则表达式中需要*的原因。例如,如果我们想要表示A0,A1 ..,Z99,我们可以这样做:

[A-Z][0-9][0-9]*

A0A(这不是我们想要的)根据以上内容也是有效的。 *给我带来了什么好处?

3 个答案:

答案 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字符串中生成匹配。