访问量: 10 次浏览
正则表达式重复匹配,本文介绍正则表达式匹配一个或多个字符,匹配零个或多个字符,
匹配零个或一个字符,为重复匹配设置一个精确的值,为重复匹配次数设置一个区间,匹配“至少重复多少次”和防止过度匹配。
本文介绍的主要元字符如下表所示。
| 元字符 | 说明 |
|---|---|
+ | 匹配一个或多个字符 |
* | 匹配零个或多个字符 |
? | 匹配零个或一个字符 |
{2} | 设定重复匹配2次 |
{2,4} | 重复匹配次数设定最小值为2,最大值为4 |
{2,} | 匹配最小的重复次数为2 |
*? , +? , {n,}? | 匹配尽可能少的字符 |
要想匹配同一个字符(或字符集合)的多次重复,只要简单地给这个字符(或字符集合)加上一个 + 字符作为后缀就行了。
+ 匹配一个或多个字符(至少一个,不匹配零个字符的情况)。
文本:
aaa@bbb.ccc
aaa.aaa@bbb.ccc
aaa@bbb.bbb.ccc
aaa.aaa@bbb.bbb.ccc
执行正则表达式:
\w+@\w+\.\w+
输出结果:

在给一个字符集合加上 + 后缀的时候,必须把 + 放在这个字符集合的 外面 。
比如, [0-9]+ 是正确的, [0-9+] 则不是,后面定义的是一个由数字 0 到 9 和 + 构成的字符集合,只能匹配一个单个的数字字符或加号。
+ 是一个元字符,如果需要匹配 + 本身,就必须使用它的转义序列 \+ 。+ 可以用来匹配一个或多个字符集合。文本:
aaa@bbb.ccc
aaa.aaa@bbb.ccc
aaa@bbb.bbb.ccc
aaa.aaa@bbb.bbb.ccc
执行正则表达式:
[\w.]+@[\w.]+\.\w+
结果:

要想匹配字符(或字符集)连续出现零次或多次的情况,可以使用 * 字符来完成, * 的用法和 + 一样,只要把它放在一个字符(或字符集)的后面就行。
文本:
.aaa@bbb.ccc
执行正则表达式:
\w[\w.]*@[\w.]+\.\w+
结果:

? 只能匹配一个字符(或字符集合)的零次或一次出现。
文本:
http://www.baidu.com/
https://www.baidu.com/
执行正则表达式:
https?://[\w./]+
结果:

正则表达式语言提供了一个用来设定重复次数的语法,重复次数要用 { 和 } 字符来给出,把数值写在它们之间。
文本:
#CCC
#123456
#abcDEF
#135xyz
执行正则表达式:
#[0-9a-fA-F]{6}
输出结果如下:

{} 语法还可以用来为重复匹配次数设定一个区间,也就是为重复匹配次数设定一个最小值和一个最大值。
文本:
4/8/03
10-6-2004
2/2/2
01-01-01
执行正则表达式:
\d{1,2}[-\/]\d{1,2}[-\/]\d{2,4}
输出结果如下:

在这个例子中,我们使用了 / 的转义序列 \/ 。这在许多正则表达式实现里是不必要的,但有些正则表达式分析器要求我们必须这样做。
为了避免不必要的麻烦,在需要匹配 / 字符本身的时候,最好总是使用它的转义序列。
{} 语法的最后一种用法是给出一个最小的重复次数(但不必给出一个最大值),可以用来匹配至少重复多少次。
文本:
1001: 496.80
1002:1290.69
1003: 26.43
1004:613.42
1005: 7.61
1006:414.90
1007: $25.00
执行正则表达式:
\d+: \$\d{3,}\.\d{2}
执行结果如下:

文本:
<b>aaa</b> bbb <b>ccc</b>
执行正则表达式:
<[Bb]>.*
执行结果如下:

这个例子中只找到了一个匹配而不是预期中的两个,因为
*
和
+
都是所谓的 “贪婪型” 元字符,它们在进行匹配时的行为模式是
多多益善而不是适可而止
的。它们会尽可能地从一段文本的开头一直匹配到这段文本的末尾,而不是从这段文本的开头匹配到碰到第一个匹配时为止。
在不需要这种 “贪婪行为” 的时候,应该使用这些元字符的 “懒惰型” 版本(“懒惰”在这里的含义是
匹配尽可能少的字符
,与贪婪型元字符的行为模式刚好相反)。懒惰型元字符的写法很简单,只要给贪婪型元字符加上一个
?
后缀即可。
文本:
<b>aaa</b> bbb <b>ccc</b>
执行正则表达式:
<[Bb]>.*?</[Bb]>
执行结果如下:
