从Regexpal开始
http://regexpal.com.s3-website-us-east-1.amazonaws.com/?_ga=1.247253956.1346968340.1458550626
匹配北美电话号码
在Regexpal下方文本框中输入电话号码
707-827-7019
接下来要用正则表达式匹配这个号码,在上方的文本框输入号码本身
707-827-7019
此时下方的文本框电话号码从头到尾都以黄色高亮显示。
刚刚所写的正则表达式是用字符串字面值(string literal)来匹配目标字符串的。
用字符组来匹配数字
如果想同时匹配电话号码中所有数值或者只匹配特定的数值,怎么办
尝试下面的表达式
[0-9]
下方的文本框所有的数字以黄色和蓝色交替高亮显示,正则表达式[0-9]对正则表达式处理器传递的信息是“匹配0到9范围内的任意数字”。
正则表达式将方括号视为特殊的元字符,因此方括号不参与匹配。[0-9]这种形式的正则表达式称作字符组,有时也叫字符集。
可以对数字的范围进行进一步限定。用更具体的一组数字也能得到同样的结果。比如
[012789]
这个字符组只会匹配列出的数字,即0、1、2、7、8、9。
要匹配任意10位以连字符分隔的北美电话号码,可以使用以下正则表达式
[0-9] [0-9] [0-9] - [0-9] [0-9] [0-9] - [0-9] [0-9] [0-9] [0-9]
但是太长了,可以用简写形式。
使用字符组简写式
\d可以像[0-9]一样匹配任意阿拉伯数字,这种正则表达式叫做字符组简写式,也叫转义字符。
可以使用以下表达式来匹配电话号码中的任意数字:
\d\d\d-\d\d\d-\d\d\d\d
除了使用连字符本身来匹配连字符以外,也可以用转义的大写D(\D),它可以匹配任何一个非数字字符。
\d\d\d\D\d\d\d\D\d\d\d\d
匹配任意字符
还可以用点号匹配那些讨厌的连字符。
\d\d\d.\d\d\d.\d\d\d\d
点号是一个通配符,可以匹配任意字符(但某些情况不能匹配行起始符)。
捕获分组和向后引用
这里我们使用捕获分组来匹配电话号码中的某一部分。然后使用后向引用对分组中的内容进行引用。
要创建捕获分组,先将一个\d放在一对圆括号中,这样就将它放入了一个分组中,后面可以用\1来对捕获的内容进行后向引用。
(\d)\d\1
\1对括号内分组捕获的内容进行了反向引用。这个正则表达式匹配的是区号707。
- (\d)匹配第一个数字并将其捕获(数字7)。
- \d匹配第二个数字(数字0)但没有捕获,因为没有括号。
- \1对捕获的数字进行反向引用(数字7)。
现在可以用一个分组和几个后向引用对整个电话号码进行匹配。
(\d)0\1\D\d\d\1\D\1\d\d\d
使用量词
现在用另一种语法来匹配电话号码
\d{3}-?\d{3}-?\d{4}
花括号中的数字表示待查找的数字出现的次数。包含数字的花括号是一种量词。花括号本身用作元字符。
问号是另一种量词,在以上表达式中表示连字符是可选的。也就是说,连字符可以不出现或只出现一次。还有其他量词,例如加号+表示“一个或多个”,星号*表示零个或多个。
使用量词能让正则表达式变得更加简洁:
(\d{3,4}[.-]?)+
加号表示出现一次或多次。这个正则表达式表示括号里的模式出现一次或多次,括号里的模式匹配三位或四位数字,后跟一个连字符或一个点号。
解释上面表达式的每一项:
- 左圆括号(为捕获分组的起始符
- \d匹配一位数字
- {3,4}表示匹配的数字是3位或者4位
- [.-]?匹配一个可选的点号或连字符
- 右圆括号)为捕获分组的结束符
- 加号+表示一个或多个
改进后:
(\d{3}[.-]?){2}\d{4}
这个表达式匹配的字符串是连续两个无括号的三位数字,每三位数字后可以带连字符也可以不带,最后是一个四位数字。
括选文字符
最后这个正则表达式表示第一个3位数字可以带也可以不带括号,即区号是可选的:
^(\(\d{3}\)|^\d{3}[.-]?)?\d{3}[.-]?\d{4}$
- 出现在正则表达式起始位置或者竖线之后^的脱字符,表示电话号码会出现在一行的起始位置
- 左括号(为捕获分组的起始符
- \(表示左括号本身
- \d匹配一位数字
- \d之后的{3}是量词,表示匹配三位数字
- \)匹配右括号本身
- 竖线符|表示选择,也就是从多个可选项中选择一个,换句话说,它表示“匹配一个不带括号的区号或一个带括号的区号”
- 脱字符^匹配行起始位置
- \d匹配一位数字
- {3}表示匹配三位数字的量词
- [.-]?匹配一个可选的点号或者连字符
- 右括号)为捕获分组的结束符
- 问号?表示分组可选,即分组中的前缀可有可无
- \d匹配一位数字
- {3}表示匹配三位数字的量词
- [.-]?匹配一个可选的点号或者连字符
- \d匹配一位数字
- {4}表示匹配四位数字的量词
- 美元符$匹配行结束位置
小结
1.[0-9],字符组,或字符集,匹配0~9的数字
2.\d,字符集简写式,匹配数字;/D匹配非数字字符
3.点号.,通配符,匹配任意字符
4.(),圆括号,捕获分组和向后引用,圆括号是一个分组,后面可以用\1来对捕获的内容进行后向引用
5.{},花括号,量词,表明出现的次数。其他量词,+表示“一个或多个”,*表示零个或多个,?表示零个或一个