1.7 使用量词

现在用另一种语法来匹配电话号码:

  1. \d{3}-?\d{3}-?\d{4}

花括号中的数字表示待查找的数字出现的次数。包含数字的花括号是一种量词(quantifier)。花括号本身用做元字符。

问号是另一种量词,在以上表达式中表示连字符是可选的。也就是说,连字符可以不出现或只出现一次。还有其他的量词,例如加号(+)表示“一个或多个”,星号(*)表示“零个或多个”。

使用量词能让正则表达式变得更简洁:

  1. (\d{3,4}[.-]?)+

对,加号表示出现一次或多次。这个正则表达式表示括号里的模式出现一次或多次,括号里的模式匹配三位或四位数字,后跟一个连字符或一个点号。

你有没有头晕呢?我希望没有。下面逐一解释表达式中的每一项 :

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

  • 反斜杠\为字符组简写式的起始符(对之后的字符进行转义);

  • 字符d为字符组简写式的结束符(d匹配0到9范围内的任意数字);

  • 左花括号{为量词起始符;

  • 数字3为匹配的最小数量;

  • 逗号,隔开不同的数量;

  • 数字4为匹配的最大数量;

  • 右花括号}为量词的结束符;

  • 左方括号[为字符组的起始符;

  • 点号.(匹配点号本身);

  • 连字符-匹配连字符的本身;

  • 右方括号]为字符组的结束符;

  • 问号?表示量词“零个或一个”;

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

  • 加号+表示量词“一个或多个”。

这个表达式能用但不完全对,因为它只能匹配3位或4位的数字,而不管是否符合电话号码的格式。好吧,犯错会让我们印象深刻,进步得更快。

我们来改进一下:

  1. (\d{3}[.-]?){2}\d{4}

这个表达式匹配的字符串是连续两个无括号的三位数字,每三位数字后可以带连字符也可以不带,最后是一个四位数字。