正则表达式重复匹配

正则表达式重复匹配,本文介绍正则表达式匹配一个或多个字符,匹配零个或多个字符,匹配零个或一个字符,为重复匹配设置一个精确的值,为重复匹配次数设置一个区间,匹配“至少重复多少次”和防止过度匹配。

本文介绍的主要元字符如下表所示,更多内容参考极客教程元字符章节。

元字符 说明
+ 匹配一个或多个字符
* 匹配零个或多个字符
? 匹配零个或一个字符
{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+

结果:
正则表达式重复匹配

在字符集合里像 .+ 这样的元字符将被解释为普通字符,不需要被转义,但是转义了也没有坏处,[\w.] 的使用效果和 [\w\.] 是一样的。

匹配零个或多个字符

要想匹配字符(或字符集)连续出现零次或多次的情况,可以使用 * 字符来完成,* 的用法和 + 一样,只要把它放在一个字符(或字符集)的后面就行。

文本:

.aaa@bbb.ccc

执行正则表达式:\w[\w.]*@[\w.]+\.\w+

结果:
正则表达式重复匹配

* 是一个元字符,如果需要匹配 * 本身,就必须使用它的转义序列 \*

匹配零个或一个字符

只能匹配一个字符(或字符集合)的零次或一次出现。

文本:

http://www.baidu.com/
https://www.baidu.com/

执行正则表达式:https?://[\w./]+

结果:
正则表达式重复匹配

极客教程空白符章节介绍,用模式 \r\n\r\n 去匹配空白行,在 Unix 或 Linux 系统上匹配空白行只使用 \n\n 即可,不需要加上 \r ,因此,可以使用正则表达式 [\r]?\n 匹配一个可选的 \r 和一个必不可少的 \n 。这里[\r]?\r? 在功能上完全等价,[]的常规用法是把多个字符定义为一个集合,也可以把一个字符定义为一个集合,这样可以增加可读性和避免产生误解。如果打算同时使用[] 和 ?,一定要把 ? 放在字符集合的外面。
? 是一个元字符,如果需要匹配 ? 本身,就必须使用它的转义序列 \?

为重复匹配次数设定一个精确的值

正则表达式语言提供了一个用来设定重复次数的语法,重复次数要用 { 和 } 字符来给出,把数值写在它们之间。

文本:

#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]>

执行结果如下:
正则表达式重复匹配

极客教程相关文章推荐:
常用正则表达式汇总
正则表达式排除字符
正则表达式匹配多个字符中的一个
正则表达式匹配特殊字符
正则表达式匹配任意字符
正则表达式 – 元字符

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程