正则表达式入门(一)什么是正则表达式

从Regexpal开始 http: regexpal com s3-website-us-east-1 amazonaws com ?_ga=1 24725

从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.{},花括号,量词,表明出现的次数。其他量词,+表示“一个或多个”,*表示零个或多个,?表示零个或一个