正则表达式高级用法---五(反向引用 /1, /2...)
反向引用 /1,/2... 表达式在匹配时,表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的 "<td>(.*?)</td>"。其实,"小括号包含的表达式所匹配到的字符串" 不仅是在匹配结束后才可以使用,在匹配过程中也可以使用。表达式后边的部分,可以引用前面 "括号内的子匹配已经匹配到的字符串"。引用方法是"/" 加上一个数字。"/1" 引用第 1 对括号内匹配到的字符串,"/2" 引用第 2 对括号内匹配到的字符串……以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号"(" 在前,那这一对就先排序号。
举例 1: 表达式 "('|")(.*?)(/1)" 在匹配 " 'Hello',"World" " 时,匹配结果是:成功;匹配到的内容是:" 'Hello' "。再次匹配下一个时,可以匹配到 " "World" "。
举例 2: 表达式 "(/w)/1{4,}" 在匹配 "aa bbbb abcdefg ccccc111121111 999999999" 时,匹配结果是:成功;匹配到的内容是"ccccc"。再次匹配下一个时,将得到 999999999。这个表达式要求"/w" 范围的字符至少重复 5 次,注意与 "/w{5,}" 之间的区别。
举例 3: 表达式 "<(/w+)/s*(/w+(=('|").*?/4)?/s*)*>.*?<//1>" 在匹配"<td id='td1' style="bgcolor:white"></td>" 时,匹配结果是成功。如果"<td>" 与 "</td>" 不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。
预搜索,不匹配;反向预搜索,不匹配
表达式 "Windows (?=NT|XP)" 在匹配 "Windows 98,Windows NT,Windows 2000" 时,将只匹配 "Windows NT" 中的"Windows ",其他的 "Windows " 字样则不被匹配。
表达式 "(/w)((?=/1/1/1)(/1))+" 在匹配字符串 "aaa ffffff999999999" 时,将可以匹配 6 个"f"的前 4 个,可以匹配 9 个"9"的前7 个。这个表达式可以读解成:重复 4 次以上的字母数字,则匹配其剩下最后 2 位之前的部分。当然,这个表达式可以不这样写,在此的目的是作为演示之用。格式:"(?!xxxxx)",所在缝隙的右侧,必须不能匹配 xxxxx 这部分表达式。
表达式 "((?!/bstop/b).)+" 在匹配 "fdjka ljfdl stop fjdsla fdj"时,将从头一直匹配到 "stop" 之前的位置,如果字符串中没有"stop",则匹配整个字符串。
表达式 "do(?!/w)" 在匹配字符串 "done,do,dog" 时,只能匹配 "do"。在本条举例中,"do" 后边使用 "(?!/w)" 和使用 "/b" 效果是一样的。反向预搜索:"(?<=xxxxx)","(?<!xxxxx)"这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在缝隙的 "左侧",两种格式分别要求必须能够匹配和必须不能够匹配指定表达式,而不是去判断右侧。与 "正向预搜索" 一样的是:它们都是对所在缝隙的一种附加条件,本身都不匹配任何字符。
其他正则博文 http://www.52php.cn/article/p-sssoyskn-sn.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c# – 异步webrequest超时=>崩溃IIS
- c# – 如何在不迭代的情况下放弃IEnumerator?
- ruby – File.dirname令人困惑的行为
- Cocos2d-x 3.0坐标系详解
- 如何快速重新排序Ruby Array给定一个订单?
- ruby-on-rails – 复制时Paperclip AWS :: S3 :: Errors ::
- VB.Net UDP中的Filetransfer应用程序与TCP和
- c# – 如何修改Expression>的类型参数?
- ios – UIImage无法在Xcode 6.3.1 Playground中渲染
- xml – 如何通过XPath选择第一个和最后一个元素?