正则表达式重复匹配,本文介绍正则表达式匹配一个或多个字符,匹配零个或多个字符,匹配零个或一个字符,为重复匹配设置一个精确的值,为重复匹配次数设置一个区间,匹配“至少重复多少次”和防止过度匹配。
本文介绍的主要元字符如下表所示,更多内容参考极客教程元字符章节。
元字符 | 说明 |
---|---|
+ |
匹配一个或多个字符 |
* |
匹配零个或多个字符 |
? |
匹配零个或一个字符 |
{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]>
执行结果如下:
极客教程相关文章推荐:
常用正则表达式汇总
正则表达式排除字符
正则表达式匹配多个字符中的一个
正则表达式匹配特殊字符
正则表达式匹配任意字符
正则表达式 – 元字符