当与点组合时,正则表达式不能按预期工作

时间:2017-04-16 05:45:09

标签: regex

我正在编写一个正则表达式来识别“A.B.C.D”形式的I​​P地址,其中A,B,C和D的值可以在0到255之间。允许前导零。 A,B,C或D的长度不能大于3.我知道这个正则表达式很容易在互联网上获得,但我自己写的是练习。

首先,我为A编写了正则表达式,如下所示:

a = ^(^0{0,2}\d|^0{0,1}\d\d|[0-1]\d\d|2[0-4]\d|25[0-5])$

它按预期工作,然后我为A.B写了如下:

ab = ^(^0{0,2}\d|^0{0,1}\d\d|[0-1]\d\d|2[0-4]\d|25[0-5])\.
      (^0{0,2}\d|^0{0,1}\d\d|[0-1]\d\d|2[0-4]\d|25[0-5])$

但不知何故,它没有按预期工作。它不是识别像“2.3”这样的字符串而是识别“2.003”。这很奇怪。我花了好几个小时搞清楚但现在完全放弃了。请帮帮我。

1 个答案:

答案 0 :(得分:2)

正如@Jorge在评论中指出的那样,^字符匹配字符串/行的开头,这可能发生在A中,因为它可能是该行中的第一组字符,但不能发生对于B,因为它总是以A开头。这就是为什么它可以匹配003(通过子模式[0-1]\d\d),但它不能通过子模式与3匹配^0{0,2}\d

删除多余的^,你应该得到所需的行为:

ab = ^(0{0,2}\d|0{0,1}\d\d|[0-1]\d\d|2[0-4]\d|25[0-5])\.
      (0{0,2}\d|0{0,1}\d\d|[0-1]\d\d|2[0-4]\d|25[0-5])