1.8 括选文字符
最后这个正则表达式表示第一个3位数字可以带也可以不带括号,即区号是可选的:
^(\(\d{3}\)|^\d{3}[.-]?)?\d{3}[.-]?\d{4}$
为了便于理解,我们再依次看一下表达式中的各项:
出现在正则表达式起始位置或者竖线(
|
)之后的脱字符^
,表示电话号码会出现在一行的起始位置;左括号
(
为捕获分组的起始符;(
表示左括号本身;\d
匹配一位数字;\d
之后的{3}
是量词,表示匹配三位数字;)
匹配右括号本身;竖线符
|
表示选择,也就是从多个可选项中选择一个,换句话说,它表示“匹配一个不带括号的区号或一个带括号的区号”;脱字符
^
匹配行起始位置;\d
匹配一位数字;{3}
是表示匹配三位数字的量词;[.-]?
匹配一个可选的点号或连字符;右括号
)
为捕获分组的结束符;问号
?
表示分组可选,即分组中的前缀可有可无;\d
匹配一位数字;{3}
表示匹配三位数字的量词;[.-]?
匹配另一个可选的点号或连字符;\d
匹配一位数字;{4}
是表示匹配四位数字的量词;美元符
$
匹配行结束位置。
这个表达式最终匹配十位的北美电话号码,而且括号、连字符或者点号都是可选的。你可以试试不同格式的电话号码,看看它能否匹配。
以上正则表达式中的捕获分组并不是必需的。分组是必要的,但是捕获不需要。更好的方法是使用非捕获分组。在本书最后一章中我们再次讨论这个正则表达式时,你自然就理解了。