学习正则表达式(一)

2016-03-12

第一章 什么是正则表达式

正则表达式是描述一组字符串特征的模式,用来匹配特定的字符串。正则表达式以“坑多”而闻名。不同的工具实现正则表达式的方式并不完全一致。

1.1 从Regexpal开始

使用谷歌浏览器打开网址Regexpal或者直接打开OrignalRegexpal。窗口顶部有一个文本区,下方还有一个更大的文本区。顶部文本区用来输入正则表达式的,下方的文本区是用来输入主题或者目标文本的。

1.2 匹配中国电话号码

首先解释下什么是字符串字面值字符串字面值就是你直观看到的字符串。例如,028-8715478。在正则表达式输入区和目标输入区,输入 028-8715478(下文都是用这个电话号码作为例子),观测目标输入区,数字被黄色高亮显示。

1.3 用字符组来匹配数字

[0-9]这种形式的正则表达式称做字符组,表示只会匹配列出的数字即0、1、2、3、4、5、6、7、8、9。其后方括号[]为正则表示中的元字符,因此方括号不参与匹配,元字符是在正则表达式中有特殊含义的,也是保留字符。

1.4 使用字符组简写式

\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{3}-\d{7}。分别试试有什么不同。其他\D表示匹配非数字字符。

1.5 匹配任意字符

点号(.)是一个通配符,可以匹配任意字符,但不能匹配行起始符(但可以是点号匹配行起始符)。

1.6 捕获分组和后向引用

使用捕获分组来匹配电话号码中的某一部分。然后使用后向引用对分组中的内容进行引用。要创建捕获分组,先将一个\d放在一堆圆括号中(\d),这样就将它放入了一个分组中,后面可以使用\1来对捕获的内容进行后向引用:(\d)\d\1
\1对圆括号内分组捕获的内容进行了反向引用。表示的是引用第一分组,如果创建了两个分组,需要引用第二个分组,则使用\2,以此类推。

  • (\d)匹配第一个数字并将其捕获;
  • \d匹配第二个数字但没有捕获,因为没有括号;
  • \1对捕获的数字进行反向引用。
    这个正则表达式仅仅匹配了区号 028。现在用一个完整的正则表达式进行匹配,我们对数字8进行捕获:
    \d\d(\d)-\1\d{5}\1

1.7 使用量词

现在用另一种语法来匹配电话号码,其实在上文已经有使用过,
\d{3}-?\d(3)-?\d{4}
其中,花括号{}中的数字表示待查找的数字出现的次数。花括号本身是元字符,里面的数字是量词。问号是另一种量词,在以上表达式中表示连字符是可选的。也就是说,连字符可以不出现或者只出现一次(次数0或者1)。注意是一次。还有其他的量词,例如加号+表示”一个或者多个”(次数n>=1),*表示”零个或者多个”(次数n>=0)。

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

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

这正则表达式表示圆括号里的模式出现一次或者多次,括号里的模式匹配三位或者四位数字,后跟一个连字符或者一个点号,且是可选的。
下面我们来解释表达式

  • 左括号(为捕获分组的起始符;
  • \d字符组的简写式;
  • 左花括号{为量词起始符;
  • 数字3,为匹配的最小数量;
  • 逗号隔开不同的数量;
  • 数字7为匹配的最大的数量;
  • 右花括号}为量词的结束符;
  • 左方括号[为字符组的起始符;
  • 点号.匹配点号本身;
  • 连字符-匹配连字符的本身;
  • 右方括号]为字符组的结束符;
  • 问号表示量词“零个或一个”;
  • 右圆括号)为捕获分组的结束符;
  • 加号+表示量词“一个或者多个”。

1.8 括选文字符

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

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

下面解释各项的含义:

  • 出现在正则表达式起始位置后者竖线|之后的脱字符^,表示电话号码会出现在一行的起始位置;
  • 左括号为捕获分组的起始符;
  • \(表示左括号本身;
  • \d匹配一位数字;
  • \d之后的{3}是量词,表示匹配三位数字;
  • \)匹配右括号本身;
  • 竖线符|表示选择,也就是从多个可选项中选择一个,换句话说,它表示“匹配一个不带括号或者一个带括号的区号”;
  • \d匹配一位数字;
  • {3}表示匹配三位数字的量词;
  • [.-]?匹配一个可选的点号或连字符;
  • 右括号为捕获分组的结束符;
  • 问号表示分组可选,
  • \d表示匹配一位数字;
  • {7}表示匹配7位数字的量词
  • 没元符$匹配行结束位置;

总结

微信公众号:嘀咕嘀咕(iOSSharers)

扫二维码关注