1.8 括选文字符

最后这个正则表达式表示第一个3位数字可以带也可以不带括号,即区号是可选的:

  1. ^(\(\d{3}\)|^\d{3}[.-]?)?\d{3}[.-]?\d{4}$

为了便于理解,我们再依次看一下表达式中的各项:

  • 出现在正则表达式起始位置或者竖线(|)之后的脱字符^,表示电话号码会出现在一行的起始位置;

  • 左括号(为捕获分组的起始符;

  • (表示左括号本身;

  • \d 匹配一位数字;

  • \d之后的{3}是量词,表示匹配三位数字;

  • )匹配右括号本身;

  • 竖线符|表示选择,也就是从多个可选项中选择一个,换句话说,它表示“匹配一个不带括号的区号或一个带括号的区号”;

  • 脱字符^匹配行起始位置;

  • \d 匹配一位数字;

  • {3}是表示匹配三位数字的量词;

  • [.-]?匹配一个可选的点号或连字符;

  • 右括号)为捕获分组的结束符;

  • 问号表示分组可选,即分组中的前缀可有可无;

  • \d 匹配一位数字;

  • {3}表示匹配三位数字的量词;

  • [.-]?匹配另一个可选的点号或连字符;

  • \d 匹配一位数字;

  • {4}是表示匹配四位数字的量词;

  • 美元符$匹配行结束位置。

这个表达式最终匹配十位的北美电话号码,而且括号、连字符或者点号都是可选的。你可以试试不同格式的电话号码,看看它能否匹配。

以上正则表达式中的捕获分组并不是必需的。分组是必要的,但是捕获不需要。更好的方法是使用非捕获分组。在本书最后一章中我们再次讨论这个正则表达式时,你自然就理解了。