[转] 揭开正则表达式的神秘面纱(3)

(1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
(2). 取匹配功效的时候,括号中的表达式匹配到的内容可以被单独获得

 

举例5:表达式 "Tom|Jack" 在匹配字符串 "I'm Tom, he is Jack" 时,匹配功效是:乐成;匹配到的内容是:"Tom";匹配到的位置是:开始于4,竣事于7。匹配下一个时,匹配功效是:乐成;匹配到的内容是:"Jack";匹配到的位置时:开始于15,竣事于19。

    举例6:表达式 "(go\s*)+" 在匹配 "Let's go go go!" 时,匹配功效是:乐成;匹配到内容是:"go go go";匹配到的位置是:开始于6,竣事于14。

    举例7:表达式 "¥(\d+\.?\d*)" 在匹配 "$10.9,¥20.5" 时,匹配的功效是:乐成;匹配到的内容是:"¥20.5";匹配到的位置是:开始于6,竣事于10。单独获取括号范畴匹配到的内容是:"20.5"。

2. 正则表达式中的一些高级法则 2.1 匹配次数中的贪婪与非贪婪

在利用修饰匹配次数的非凡标记时,有几种暗示要领可以使同一个表达式可以或许匹配差异的次数,好比:"{m,n}", "{m,}", "?", "*", "+",详细匹配的次数随被匹配的字符串而定。这种反复匹配不定次数的表达式在匹配进程中,老是尽大概多的匹配。好比,针对文本 "dxxxdxxxd",举譬喻下:

表达式

 

匹配功效

 

(d)(\w+)

 

"\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"

 

(d)(\w+)(d)

 

"\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。固然 "\w+" 也可以或许匹配上最后一个 "d",可是为了使整个表达式匹配乐成,"\w+" 可以 "让出" 它原来可以或许匹配的最后一个 "d"

 

由此可见,"\w+" 在匹配的时候,老是尽大概多的匹配切合它法则的字符。固然第二个举例中,它没有匹配最后一个 "d",但那也是为了让整个表达式可以或许匹配乐成。同理,带 "*" 和 "{m,n}" 的表达式都是尽大概地多匹配,带 "?" 的表达式在可匹配可不匹配的时候,也是尽大概的 "要匹配"。这 种匹配原则就叫作 "贪婪" 模式 。

非贪婪模式:

    在修饰匹配次数的非凡标记后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽大概少的匹配,使可匹配可不匹配的表达式,尽大概的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式,也叫作 "委曲" 模式。假如少匹配就会导致整个表达式匹配失败的时候,与贪婪模式雷同,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配乐成。举譬喻下,针对文本 "dxxxdxxxd" 举例:

表达式

 

匹配功效

 

(d)(\w+?)

 

"\w+?" 将尽大概少的匹配第一个 "d" 之后的字符,功效是:"\w+?" 只匹配了一个 "x"

 

(d)(\w+?)(d)

 

为了让整个表达式匹配乐成,"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,从而使整个表达式匹配乐成。因此,功效是:"\w+?" 匹配 "xxx"

 

更多的环境,举譬喻下:

    举例1:表达式 "<td>(.*)</td>" 与字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配时,匹配的功效是:乐成;匹配到的内容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符串, 表达式中的 "</td>" 将与字符串中最后一个 "</td>" 匹配。

    举例2:对比之下,表达式 "<td>(.*?)</td>" 匹配举例1中同样的字符串时,将只获得 "<td><p>aa</p></td>", 再次匹配下一个时,可以获得第二个 "<td><p>bb</p></td>"。

2.2 反向引用 \1, \2...

表达式在匹配时,表达式引擎会将小括号 "( )" 包括的表达式所匹配到的字符串记录下来。在获取匹配功效的时候,小括号包括的表达式所匹配到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用场所中,当用某种界线来查找,而所要获取的内容又不包括界线时,必需利用小括号来指定所要的范畴。好比前面的 "<td>(.*?)</td>"。

    其实,"小括号包括的表达式所匹配到的字符串" 不只是在匹配竣事后才可以利用,在匹配进程中也可以利用。表达式后边的部门,可以引用前面 "括号内的子匹配已经匹配到的字符串"。引用要领是 "\" 加上一个数字。"\1" 引用第1对括号内匹配到的字符串,"\2" 引用第2对括号内匹配到的字符串……以此类推,假如一对括号内包括另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 "(" 在前,那这一对就先排序号。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7818.html