为了对重复性匹配有更多的控制,正则表达式提供了一个用来设定重复次数(interval) 的语法,重复次数用{}来指定
{和}是元字符,如果需要匹配{和}本身,必须用\对它们进行转义.
1 为重复匹配次数设定一个精确的值
如匹配一个RGB值, #[[:xdigit:]]{6} 或#[0-9a-fA-F]{6}就可以实现
2 为重复匹配次数设定一个区间
{}可以用来为重复匹配次数设定一个区间,也就是为重复匹配次数设定一个最小值和一个最大值.
看一个例子
4/8/03 10-6-2004 2/2/2 01-01-01
正则表达式 : \d{1,2}[-\/]\d{1,2}[-\/]\d{2,4}
结果
4/8/03 10-6-2004 2/2/2 01-01-01
在这个例子中,使用了/的转义序列\ /, 实际上在许多正则表达式中是不必要的, 但最好还是使用转义符号
{0,3}表示重复次数可以是0,1,2,3 ,另外? 等价于{0,1}
3 匹配 至少重复多少次
用法 {3, }:表示至少重复3次, 注意: 如果遗漏大括号里的“,” 将变成精确匹配
4 防止过度匹配
*,+ 都是所谓“贪婪型” 元字符
看一个示例, 请仔细体会
This offer is not available to customers living in <B>AK</B> and <B>HI</B>
正则表达式 <[Bb]>.*?</[Bb]>
结果
This offer is not available to customers living in <B>AK</B> and <B>HI</B>
注意如果表达式为 <[Bb]>.*</[Bb]> ,将匹配一个,从第一个<B>匹配到最后一个</B>, 因为*和+都是所谓的"贪婪型" 元字符,它们在进行匹配时是多多益善,而不是适可而止,
它们会尽可能地从一段文本的开头一直匹配到这段文本的末尾,而不是从这段文本的开头匹配到碰到第一个匹配时为止.
要解决这个问题,需要使用这些元字符的 "懒惰型" 版本, 也就是匹配尽可能少的字符,懒惰型元字符语法:只要给贪婪型元字符加上一个?后缀即可
常用的贪婪型元字符和它们的懒惰型版本
___________________________________________________________________________
贪婪型元字符 懒惰型元字符
___________________________________________________________________________
* *?
+ +?
{n, } {n, } ?
___________________________________________________________________________
*? 是 * 的懒惰型版本, 在上面例子中, 使用了懒惰的 *?, 第一个匹配将仅限于AK,原始文本里的 <B>HI</B>成为了第二个匹配