第一章 什么是正则表达式
正则表达式是描述一组字符串特征的模式,用来匹配特定的字符串。正则表达式以“坑多”而闻名。不同的工具实现正则表达式的方式并不完全一致。
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)
扫二维码关注