正则表达式-分组

阅读: 4351    发布时间: 2018-01-28 11:47:03

我们再从一个实例出发

假如我们要匹配一个ip地址,应该怎么写正则表达式呢,常见的ip地址,比如“127.0.0.123”,每位都是1-3位的数字,中间用英文句号隔开。

ok,利用前面的知识很容易写出来,“^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$”,可以看出“\d{1,3}\.”重复了3次,有一些繁琐,我们可以将“\d{1,3}\.”当作一个组,用括号扩起来,将整个组出现的次数设为3,这样“^(\d{1,3}\.){3}\d{1,3}$”

var patt=/^(\d{1,3}\.){3}\d{1,3}$/
alert( patt.test("192.168.1.233"))    //返回true
alert( patt.test("255.255.255.255"))  //返回true
alert( patt.test("999.999.999.999"))  //返回true


很遗憾,这并不是一个真正的ip地址,因为ip地址每位最大为255,我们还要对每位的大小进行限制,分析如下

不超过255有3种情况

  • 以0或1开头,后面2位0-9随意,“[01]\d?\d?”

  • 以2开头,中间一位0-4,最后一位0-9,“2[0-4]?\d?”

  • 以2开头,中间一位为5,最后一位0-5,“25[0-5]?”

  • 我们将上面3种情况用或运算结合起来,所以不超过255的正则表达式为“[01]\d?\d?|2[0-4]?\d?|25[0-5]?”

将该表达式作为一个分组,后面加上英文句号,再作为一个大分组,重复3次

ip地址的正则表达式为“^(([01]\d?\d?|2[0-4]?\d?|25[0-5]?)\.){3}([01]\d?\d?|2[0-4]?\d?|25[0-5]?)$”

var patt=/^(([01]\d?\d?|2[0-4]?\d?|25[0-5]?)\.){3}([01]\d?\d?|2[0-4]?\d?|25[0-5]?)$/
alert( patt.test("127.0.0.1"))         //返回true
alert( patt.test("255.255.255.255"))   //返回true
alert( patt.test("999.999.999.999"))   //返回false


-END-