1、匹配一个或多个字符 匹配一个字符(或一个字符集合)的多次重复
+ 匹配一个或多个字符(至少一个:不匹配零个字符的情况)
a匹配a本身,a+将匹配一个或多个连续出现的a
[0-9]匹配任意单个数字,[0-9]+匹配一个或多个连续的数字
提示:+是一个元字符,如果需要匹配+本身,就必须使用它的转义序列\+
2、匹配零个或多个字符 匹配一个字符(或一个字符集合)重复0次或多次
* 匹配一个或多个字符(零个或多次)
提示:*是一个元字符,如果需要匹配*本身,就必须使用它的转义序列\*
3、匹配零个或一个字符
? 只能匹配一个字符(或字符集合)的零次或一次出现,最多不超过一次
提示:?是一个元字符,如果需要匹配?本身,就必须使用它的转义序列\?
https http 正则表达式:https? 匹配结果 https http
匹配的重复次数
+和*匹配的字符个数没有上限,无法为它们将匹配的字符个数设定一个最大值
+、*和? 至少匹配0个或一个字符。无法为它们将匹配的字符个数另设定一个最小值
+和* 无法为它们匹配的字符个数设定为一个精确的数字
4、为重复匹配次数设定一个精确的值
{n} 前一个字符(或字符集合)必须在原始文本里连续出现n次才算是匹配
#33ffee #ffffff #666666 #ff0000 #999 正则表达式 :#[0-9A-Fa-f]{6} 匹配结果 #33ffee #ffffff #666666 #ff0000
5、为重复匹配次数设定一个区间
{min,max} 为重复匹配次数设定一个最小值和一个最大值
{2,4}一个字符(或字符集合)最少重复2次,最多重复4次
注意:重复次数可以是0,比如{0,3}表示重复次数可以是0、1、2、3次
?可以匹配一个字符(或字符集合)0次或1次。因此从效果上看,等价于{0,1}
6、匹配“至少重复多少次”
{n,} 表示一个字符(或字符集合)至少重复n次 只给出一个最小重复次数,但不必给出一个最大值
$496.60 $1299.99 $26.43 $613.42 $7.69 $25 $389.1 $500 正则表达式 \$\d{3,}\.\d{2} 匹配结果如下 $496.60 $1299.99 $613.42
7、防止匹配过度
?只能匹配0次或者1次
{n}和{m,n}有一个重复次数的上限
但其他的重复匹配语法在重复次数方面都没有上限值,而这样做有时会导致过度匹配的现象。
this offer is not available to customers living in <B>AK</B> and <b>HI</b> 正则表达式 <[Bb]>.*</[Bb]> 匹配结果 <B>AK</B> and <b>HI</b>
为什么会出现这样,因为*和+都是所谓的“贪婪性”元字符,它们在进行匹配时的行为模式是多多益善而不是适可而止。
它们尽可能地从一段文本的开头一直匹配到这段文本的末尾,而不是从这段文本的开头匹配到第一个匹配时为止。
在不需要这种“贪婪行为”的时候该怎么办?答案是使用这些元字符的“懒惰性”版本,懒惰性元字符的写法很简单,只要给贪婪性元字符加上一个?后缀即可。
常用的贪婪型元字符和它们的懒惰型版本
贪婪型元字符 懒惰型元字符
* *?
+ +?
{n,} {n,}
this offer is not available to customers living in <B>AK</B> and <b>HI</b> 正则表达式 <[Bb]>.*?</[Bb]> 匹配结果 <B>AK</B> <b>HI</b>
注意:大多数例子使用的都是“贪婪型”元字符,而我们这么做的出发点是为了让那些示例模式尽可能地简明易懂。在实际工作中,请务必根据具体情况来选用“贪婪型”或“懒惰型”元字符。