正则表达式是用来匹配字符串的。它根据一套自定义的匹配规则来得到预期字符串。
比如,有一段邮箱的字符串:“740974794@qq.com”,我想从这一段字符串中匹配出“@”后面的字符串,就可以用正则表达式自定义规则来匹配。
根据自定义的匹配规则,我们可以从字符串中得到0个或至少一个匹配结果,对于匹配结果我们就可以根据程序的需要进行后续的操作。
要点
学习正则表达式要从以下这两个要点进行下手:
- 匹配规则
- 表达式的字符含义
匹配规则
正则表达式在要匹配的字符串中从左至右逐字搜索,逐字匹配。只有字符串中某个片段与匹配规则完全吻合,才算匹配成功。字符串中可以有一个或多个片段匹配成功,也可以没有匹配,即匹配失败。
举个栗子
匹配规则 | 字符串 | 匹配结果 |
---|---|---|
xiaoyang | “xiaoyangblogt.duapp.com” | “xiaoyang”(1处匹配) |
a | “xiaoyangblogt.duapp.com” | “a”(3处匹配) |
xiaoblog | “xiaoyangblogt.duapp.com” | 匹配失败 |
表达式的字符含义
正则表达式的匹配规则是由字符组成的,其字符大致可以分为两类:一类是普通字符,另一类是特殊字符。无论哪种字符,它们的出现都是为了定义匹配规则,从而得到预期的匹配结果。下面来分别展示表达式中的这两种字符。
普通字符
像字母、数字、汉字、下划线等在正则中没有特殊意义的字符都是普通字符。比如上例中的”xiaoyang”,”a”,”xiaoblog”这些表达式中的字符都是普通字符。可能你会对普通字符的定义还是摸不着头脑,别着急,客官你继续往下看,对比特殊字符,你可能就会知道正则的普通字符有哪些了(因为除了特殊字符以外的字符都是普通字符 ~O(∩_∩)O~)
特殊字符
正则表达式的特殊字符按照作用我把它分为
- 匹配特定字符集
- 匹配自定义字符集
- 通配符
- 位置符
- 转义字符
- () 与 |
特定字符集
特殊字符 | 字符含义 |
---|---|
\s | 匹配一个空白字符,包括空格,制表符,换页符 |
\S | 匹配一个非空白字符,和\s正好相反 |
\d | 匹配一个数字字符(0~9) |
\D | 匹配一个非数字字符,和\d正好相反 |
\w | 匹配一个字母或数字或下划线字符 |
\W | 匹配一个非字母、数字、下划线字符,和\w正好相反 |
.(英文点) | 小数点,匹配除了换行符以外的任意一个字符 |
举个栗子
匹配规则 | 字符串 | 匹配结果 |
---|---|---|
\d\d | “abc12“ | “12”(1处匹配) |
a.\d | “abc12″ | “bc1″(1处匹配) |
\D\d | “abc12″ | “c1″(1处匹配) |
\S\s\d | “abc 12″ | “c 1″(1处匹配) |
自定义字符集
使用方括号”[]”特殊字符,能够匹配其中包含的任意一个字符;使用”[^]”字符,则与”[]”字符正好相反,其能够匹配其中所有字符之外的一个字符
举个栗子
下面举几个”[]”字符和”[^]”字符的例子:
表达式 | 表达式含义 |
---|---|
[aA@] | 匹配”a”或”A”或”@”其中的一个字符 |
[^aA@] | 匹配除”a”,”A”,”@”之外的一个字符 |
[f-k] | 匹配英文字母”f”到”k”中的一个字符 |
[^f-k] | 匹配非除英文字母”f”到”k”之外的一个字符 |
[f-k0-5] | 匹配英文字母”f”到”k”或数字”0″到”5″中的一个字符 |
[^f-k0-5] | 匹配除英文字母”f”到”k”和数字”0″到”5″之外的一个字符 |
[f-k178] | 匹配”f”到”k”或”1″或”7″或”8″中的一个字符 |
结论
由上可以看出:”[]”(或”[^]”)字符对于其中枚举的字符对应到规则上是“或”的关系,即一个”[]”(或”[^]”)字符只能匹配字符串中的一个字符。如[aA@]对应到规则上是”a”或”A”或”@”。另外,
- 如果想枚举不连续的字符(一般是根据UTF-8字符集上的顺序),有多少写多少就可以,如[aA@];
- 如果想枚举连续的字符,用”-“(英文减号)链接即可,如[a-z]。
- 也可以这两方式混合写,如[f-k178]表示匹配字符”f”到”k”或”1″或”7″或”8″中的1个字符,[f-k0-5]表示匹配字符”f”到”k”或”0″到”5″中的1个字符。
通配符
正则表达式中的通配符是用来修饰匹配次数的。下表中列出了通配符和其作用
通配符 | 作用 |
---|---|
{n} | 作用对象重复n次 |
{m,n} | 作用对象重复至少m次,至多n次 |
{m,} | 作用对象重复至少m次 |
? | 作用对象重复0次或1次,相当于{0,1} |
+ | 作用对象重复至少1次,相当于{1,} |
* | 作用对象重复0次或多次,相当于{0,} |
通配符的作用对象是指其在正则表达式中修饰的片段。
- 如果正则表达式的单个字符(普通字符和特殊字符都可以)紧邻的下一个字符是通配符,那么该通配符的作用对象就是该单个字符。
- 如果正则表达式中的小括号”()”后面紧邻的下一个字符是通配符,那么该通配符的作用对象是该括号中的表达式。括号中的表达式可以是一个或多个正则字符。
关于小括号的作用,留到后面讲解。
举个栗子
下面表格是关于通配符的例子:
匹配规则 | 字符串 | 匹配结果 |
---|---|---|
\d+ | “It’s cost $12.5″ | “12”(1处匹配) |
(\d123)+ | “123212341233333″ | “21234123”(1处匹配) |
\d{2,} | “123212hy341233333“ | “123212” ,“341233333”(2处匹配) |
\d{2,5} | “123212hy341233333″ | “12321” ,“34123”(2处匹配) |
[a-zA-Z]{2} | “123212hy341233333″ | “hy”(1处匹配) |
位置符
位置符 | 作用 |
---|---|
^ | 定位字符串开始的地方,该符号不匹配字符 |
$ | 定位字符串结束的地方,该符号不匹配字符 |
\b | 定位字符串边界的地方,该符号不匹配字符 |
\B | 定位字符串非边界的地方,该符号不匹配字符,和\b正好相反 |
^ ,$,\b,\B是有特殊意义的正则符号,它们本身不匹配任何字符。
比如,
^sa,表示匹配以”sa”开头的字符串;
sa$,表示以”sa”结尾的字符串。
\b:相邻的\w和\W就是一个\b。
举个栗子
匹配规则 | 字符串 | 匹配结果 |
---|---|---|
^aa | “ccbbaacc” | 匹配失败 |
^aa | “aaccbbcc” | “aa”(1处匹配) |
aa$ | “aaccbbcc” | 匹配失败 |
aa$ | “ccbbccaa“ | “aa”(1处匹配) |
.\b. | “123@qq.com” | “3@” ,“q.”(2处匹配) |
c\ba | ” cabc” | 匹配失败 |
a\b | “aaaa*” | “a”(1处匹配) |
\ba | “*aaaabc” | “a”(1处匹配) |
转义字符
在正则表达式中,如果想匹配 . (点)字符本身怎么办呢?那就要用到转义字符了。
转义字符格式:
\ + 需要转义的字符。
转义字符用于匹配在正则表达式中有特殊含义的字符。
正则表达式中需要转义的字符有:
^
$
.
(
)
[
]
{
}
?
+
*
|
\
/
如,
正则表达式\(a+\)
匹配字符串”(aa)(aabb)”
结果是”(aa)”
另外,
如果匹配
换行符(\n),
回车符(\r),
制表符(\t)
等非打印字符时,也要用转义字符匹配。
()与|符号
在正则表达式中,小括号()用于捆绑、打包字符片段,使括号内的字符片段作为一个整体,然后可以对其进行统一的操作
那么,括号的作用有二:
- 作为通配符的一个整体修饰对象
- 括号内的字符片段匹配成功时,将匹配成功的字符片段作为副本保存起来,以供后续使用。
对于上述第二个作用,如果要在当前表达式中引用括号中保存起来的片段,要用\ + 数字
引用。
比如,
\1表示由左到右的第一个括号中存储的字符片段,
\2表示第二个括号中存储的字符片段,
……
以此类推。
注意:
引用的是已经匹配成功的片段副本,而不是括号中的正则表达式的模式。如果括号嵌套也没关系,因为括号引用是以左括号出现的顺序排序的。
关于()的存储功能会在下一篇正则高级应用中详细讲解
举个栗子
匹配规则 | 字符串 | 匹配结果 |
---|---|---|
(abc)+a | “abcabca” | “abca”(1处匹配) |
(abc)wz\1 | “abcwzabcccc” | “abcwzabc”(1处匹配) |
(\d)aa\1 | “1aa1aa2″ | “1aa1″(1处匹配) |
(\d(\w)a)\1\2 | “3wa3wawa3wa3raa” | “3wa3waw”(1处匹配) |
竖线 |
竖线”|”表示“或”,如a|b,表示匹配字符”a”或”b”中的一个字符
举个栗子
匹配规则 | 字符串 | 匹配结果 |
---|---|---|
(a|b)oot | aootooboot | “aoot” ,“boot”(2处匹配) |
(a|b)oot | aboot | “boot”(1处匹配) |
a|Text | “aextText“ | “a” ,“Text”(2处匹配) |
(ab|ef)+ | “ababef“ | “ababef”(1处匹配) |
上例中a|Text,表示的是匹配字符”a”或”Text”,而不是”aext”或”Text.我们很容易误认为是第二种结果,如果要想得到第二种结果,规则应该这样写:(a|T)ext
注:以上所有例子中的匹配附加条件都是:全局匹配,区分大小写,单行匹配