从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)0\1\D\d\d\1\D\1\d\d\d
使用量词
现在用另一种语法来匹配电话号码
\d{3}-?\d{3}-?\d{4}
花括号中的数字表示待查找的数字出现的次数。包含数字的花括号是一种量词。花括号本身用作元字符。
问号是另一种量词,在以上表达式中表示连字符是可选的。也就是说,连字符可以不出现或只出现一次。还有其他量词,例如加号+表示“一个或多个”,星号*表示零个或多个。
使用量词能让正则表达式变得更加简洁:
(\d{3,4}[.-]?)+
加号表示出现一次或多次。这个正则表达式表示括号里的模式出现一次或多次,括号里的模式匹配三位或四位数字,后跟一个连字符或一个点号。
解释上面表达式的每一项:
改进后:
(\d{3}[.-]?){2}\d{4}
这个表达式匹配的字符串是连续两个无括号的三位数字,每三位数字后可以带连字符也可以不带,最后是一个四位数字。
括选文字符
最后这个正则表达式表示第一个3位数字可以带也可以不带括号,即区号是可选的:
^(\(\d{3}\)|^\d{3}[.-]?)?\d{3}[.-]?\d{4}$
原文:http://www.cnblogs.com/hahazexia/p/5303015.html