正则表达式这个东西可以称得上是一门玄学,就算是你自己写的表达式,过个几天回来看依然是一脸懵逼,更不要说去看别人写的表达式了。甚至国外有程序员说了这样一句话:如果你有一个问题,并且你想到了用正则表达式来解决它,那么你现在有两个问题了。从这句话也不难看出,正则表达式还是很难的。那为什么大家还要用它呢?因为它在文本处理方面的能力太过于强大了。总之呢,广大程序员对它是又爱又恨。
0、引入
- 字母家族
中,在刚刚打字的过程中混进去了几个坏人dongdongqiang
,现在我们需要帮助字母家族将坏人抓出来。但是我不是警察呀,我哪会破案。于是乎,我只能请我们的大侦探正则兄来帮忙啦!正则兄一看,给了我两件宝贝dong d0ong qiang
、\d
。我这赶紧就去找坏人了。\s
嘿嘿,找到一个,我说是谁呢,原来是数字小老弟哈。接下来我们再去试试另一件宝贝正则表达式之元字符0、引入1、元字符 搞定,竟然是一些占着茅坑不拉shi的空白字符。正则表达式之元字符0、引入1、元字符 - 破完案的感觉怎一个爽字了得,哈哈哈!!悄悄告诉你们,我刚刚从字母家族出来之后,捡到了一个包裹
,但是我区分不了它们是否值钱呀,哎!只能舔着脸去找正则兄了。什么,你说正则兄是侦探怎么还能鉴宝了,对此,我只能说,正则兄的强大不是我等能想象的。正则兄呢又给了我一件宝贝ascHJ#$%D4hu*(358Y___---=
,说它会告诉我哪些是价值连城的:\w
哈哈哈,竟然有这么多宝贝,原来所有的字母数字下划线都是价值连城的好宝贝呀!其它的想必也不会太差,我还是把它们全都放到我的仓库里吧!正则表达式之元字符0、引入1、元字符 - 最近手头有点紧,想把之前捡到的宝贝拿出来卖了,但是仓库好多东西呀!乱糟糟的,怎么把上次捡到的东西全部拿出来呢?正在我一筹莫展的时候,正则兄出现了,得知我的困难后,他又给了我一件宝贝
,我赶紧拿着宝贝去找东西去了.
果然找到了,正则兄这次给的宝贝好像能找到任意的字符哦!!正则表达式之元字符0、引入1、元字符 - 某天,我独自一人走在回家的小路上,突然,一个大大的问号出现在了我的脑海中:为什么正则兄会有这么多奇奇怪怪的宝贝???还总是有各种奇奇怪怪的人来找他,来的时候都愁眉苦脸,走的时候又蹦又跳,而且这些人还不止来一次。 想着想着我竟然来到正则兄的家门口,就在我犹豫要不要进去的时候,正则兄突然出来了,然后就把我叫进去了。进来之后我发现他的家里也没有特殊的,然后正则兄突然开口问我是不是有什么问题?我也不知道该不该问,一直在支支吾吾的,正则兄可能是等得不耐烦了,想让我先回去,就在正则兄准备起来给我开门的时候我一口气把之前的疑问全都说出来了。然后正则兄就笑了,说这些都不是什么宝贝,就是专门用来按一定的规则对字符串进行匹配的,用它们组成的式子叫做正则表达式,然后还说:之前给我的都是一些基础的元字符,除了前面提到的
、\d
、\s
、\w
,还有其它的,比如:.
、\D
、\W
等。它们的作用如下表:\S
符号 | 意义 |
---|---|
. | 表示任意字符 |
\d | 表示任意数字 |
\D | 表示任意非数字 |
\w | 表示任意字母数字下划线 |
\W | 表示任意非字母数字下划线 |
\s | 表示任意空白符 |
\S | 表示任意非空白符 |
除此之外,他还告诉我,这些元字符单独使用并不能体现出正则表达式的强大之处,比如
\[email protected]\.com
就可以匹配出QQ邮箱来(这个表达式还有很多缺陷,后面再来说)。这让我觉得很神奇,就赖着他求他教我,最终他受不了我烦他,于是就答应我了。
1、元字符
除了之前说到的
\d
、
\D
、
\s
、
.
等这类表示单个特殊字符的元字符外,还有表示空白符、量词、范围的元字符。下面一个一个来说:
1. 空白符
在我们对文本进行处理的时候,总会遇到各种各样的空白符,比如空格、换行、制表符等。虽然我们上面已经提到了一个可以匹配任意空白符的
\s
。但是它的范围太宽泛了,有的时候太宽泛并不是一件好事,所以正则表达式也提供了可以匹配特定空白符的一些元字符:
符号 | 意义 |
---|---|
\r | 回车 |
\n | 换行 |
\f | 换页 |
\v | 垂直制表符 |
\t | 制表符 |
还有一个比较常用的空白符:空格。除了可以用
\s
来匹配,我们还可以就用空格来匹配(英文模式下的空格)。
2. 量词
上面说到的元字符都是只能匹配单个字符的,当我们需要匹配同一类型的字符很多次的时候就会很麻烦,总不能要匹配多少个就重复写多少个上面的元字符吧!就算你不怕麻烦,就像这样写,那么要是让你匹配“无数个”数字出来呢?你咋办?所以量词就很重要了。在正则表达式中有“量词”功能的元字符有三个:
符号 | 意义 |
---|---|
* | 匹配0次到多次 |
+ | 匹配一次到多次 |
? | 匹配0次或者1次 |
但是这三个元字符好像不够用哈,比如我们要匹配某个字符3次、至少3次、3次到5次怎么办呢?别急,正则表达式还有一种方式可以有量词的作用:
符号 | 意义 |
---|---|
{m} | 匹配m次 |
{m,} | 至少匹配m次 |
{m,n} | 匹配m次到n次 |
那量词怎么使用呢?上面提到的邮箱匹配就是一种。再比如,我们要匹配5个空格,
{5}
,前面有个空格哦!
3. 范围
假如我们要匹配满足某个区间或者某个集合的数据,例如:匹配出字符a或者b、匹配出a-z等。怎么做呢?在正则中中括号
[]
,就可以提供匹配某个区间的功能,中括号和竖线就可以匹配出或者的功能。
符号 | 意义 |
---|---|
| | 或者 |
[…] | 里面任意一个 |
比如上面说的例子:a或者b的表达式就是
a|b
,或者
[ab]
,匹配a-z的表达式就是
[a-z]
。还有一个符号
^
,也可以配合中括号来使用,例如:
[^...]
,可以匹配除了出现在中括号里面的任何字符,这个
^
在这就是取反的意思。
到这,元字符的知识就结束了。
最后我们再来完善一下前面提到的匹配qq邮箱的表达式:
对于qq邮箱有什么规则呢?
- 前缀由数字或者字母组成
- 长度也是有限制的,这里假如是5到11位
那么根据这两条规则怎么来写呢?
[a-zA-Z0-9|\d]{5,11}@qq\.com
点前面的\是转义的意思。