我们前面已经学习了如何重复1个字符(直接在字符后面加上限定符就行了),但如果想要重复多个字符该怎么办呢?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作(后面会有介绍)。

举例:

(\d{1,3}.){3}\d{1,3} 是一个 简单的IP地址匹配 表达式。要理解这个表达式,请按下列顺序分析它: \d{1,3} 匹配 1到3位的数字(\d{1,3}.){3} 匹配 三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上 一个一到三位的数字(\d{1,3})。

不幸的是,它也将匹配256.300.888.999这种不可能存在的IP地址。如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择字符类来描述一个正确的IP地址:
((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
理解上面这个表达式的关键是理解 2[0-4]\d|25[0-5]|[01]?\d\d? ,这里我就不细说了,你自己应该能分析得出来它的意义。

知识点:
IP地址中每个数字都不能大于255. 经常有人问我, 01.02.03.04 这样前面带有0的数字, 是不是正确的IP地址呢? 答案是: 是的, IP 地址里的数字可以包含有前导 0 (leading zeroes)。