正则表达式4____重复匹配(2)

来源:互联网 发布:男性粘液丝高 知乎 编辑:程序博客网 时间:2024/06/05 14:50

为了对重复性匹配有更多的控制,正则表达式提供了一个用来设定重复次数(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>成为了第二个匹配

原创粉丝点击