第五章:重复匹配

5.1 有多少个匹配:

  5.5.1 匹配一个或多个字符:

    想要匹配同一个字符(或字符集合)的多次重复,只要简单的给这个字符(或字符集合)加上一个+字符作为后缀即可。 

    + : 表示匹配一个或多个字符,比如[0-9]表示匹配任意单个数字,[0-9]+将匹配一个或多个连续的数字

   注意:

     在给字符集合加上+后缀的时候,必须把+放在字符集合的外边,比如说[0-9]+是正确的匹配一个或多个连续的数字,而[0-9+]只是匹配一个单个的数字或加号

   文本:

    Send personal email to ben@forta.com. For qwestions about a book user support@forta.com. Feel free to send unsolicited email to spam@forta.com (wouldn't it be nice if it were that simple, huh?)

   正则表达式:

    w+@w+.w+   

   结果:

    Send personal email to ben@forta.com. For qwestions about a book user support@forta.com. Feel free to send unsolicited email to spam@forta.com (wouldn't it be nice if it were that simple, huh?)

注意:

  +是一个元字符,要相匹配+本身,就必须使用它的转义序列 +

再看一个例子:

  文本:

    Send personal email to ben@forta.com or ben.forta@forta.com. For qwestions about a book user support@forta.com. Feel free to send unsolicited email to spam@forta.com (wouldn't it be nice if it were that simple, huh?)

  正则表达式:

    w+@w+.w+

  结果:

    Send personal email to ben@forta.com or ben.forta@forta.com. For qwestions about a book user support@forta.com. Feel free to send unsolicited email to spam@forta.com (wouldn't it be nice if it were that simple, huh?)

  分析:

    ben.forta@forta.com未正确匹配

  调整后的正则表达式:

    [w.]+@[w.].w+

注意:

  当在字符集合([])里使用的时候,像.和+这样的元字符将被解释成普通字符,不需要转义,但转义也没有关系。[w.] 和 [w.]是等价的

5.1.2 匹配零个或多个字符:

  +匹配一个或多个字符,但不匹配零个字符,+最少也要匹配一个字符,那要想匹配一个可有可无的字符,该使用*元字符来完成

  文本:

    Hello .ben@forta.com is my email address.

  正则表达式:

    [w.]+@[w.].w+

  结果:

    Hello .ben@forta.com is my email address.

  正确的正则表达式:

    [w.]*@[w.].w+

  结果:

    Hello .ben@forta.com is my email address.

注意:

  *是一个元字符,要想匹配*本身需要对其进行转义

5.1.3 匹配零个或一个字符:

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

  文本:

    The URL is http://www.forta.com, to connect securely user https://www.forta.com/ instead.

  正则表达式:

    http://[w./]+

  结果:

    The URL is http://www.forta.com, to connect securely user https://www.forta.com/ instead.

在http后加一个s*并不能解决问题,因为httpssss://这种事非法的url

  正确的正则表达式:

    https?://[w./]+

  结果:

    The URL is http://www.forta.com, to connect securely user https://www.forta.com/ instead.

注意:

  ?是一个元字符,要想匹配*本身需要对其进行转义

拓展:

  之前说过在Windows系统下匹配空行为 ,在linux系统下匹配空行为 ,那想写出在Windows和linux系统下通用的空行匹配正则表达式该怎么写呢:

  [ ]? [ ]?

5.2 匹配的重复次数:

  我们学过+,*和?,但这并不能对重复性匹配有一个精确的控制,所以在正则表达式中提供了一个用来设定重复次数的语法,重复次数要用 { 和 } 字符来给出,把重复的次数卸载它们之间即可

注意:

  { 和 }是元字符,要想匹配他们本身需要对他们进行转义

5.2.1 为重复匹配设定一个精确的值:

    文本:

      #123456 #12345 #1234567

    正则表达式:

      #d{6}

    结果:

      #123456 #12345 #1234567

5.2.2 为重复匹配次数设定一个区间:

    {}语法还可以为重复次数设定一个区间,也就是设定一个重复匹配的最小值和最大值,{2,4}表示最少重复2次,最多重复4次

    文本:

      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

注意:

  在上面的例子中,匹配 / 的时候我们使用了转义序列 /

5.2.3 匹配“至少重复多少次”

  使用 {3,} 来表示至少重复3次或更多次

  文本:

    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}

  结果:  

    1001:$496.80

    1002:$1290.69

    1003:$26.43

    1004:$613.42

    1005:$7.61

    1006:$414.90

    1007:$25.00

5.3 防止过度匹配:

  文本:

    <B>AK</B> and <B>HI</B>

  正则表达式:

    <Bb>.*</Bb>

  结果:

    <B>AK</B> and <B>HI</B>

  分析:

    +和*属于“贪婪型”元字符,他们在匹配的时候是多多益善而不是适可而止,当你不需要这种“贪婪行为”时,你就需要使用这些元字符的“懒惰型”版本,即在贪婪型元字符后面加一个?即可。

  懒惰型正则表达式:

    <Bb>.*?</Bb>

  结果:

    <B>AK</B> and <B>HI</B>

原文地址:https://www.cnblogs.com/changlezhong/p/9095050.html