最近,许多正则表达式问题在查询中都具有​​某种环顾四周的元素,对我而言,这对成功匹配不是必需的。有什么教学资源可以促进他们吗?我正在尝试通过积极的前瞻性了解到底哪种情况会更好。我可以看到的主要应用程序是尝试不匹配元素时。但是,例如,这个来自最近一个问题的查询提供了一种简单的解决方案来捕获.*,但是为什么要背后看呢?

(?<=<td><a href="\/xxx\.html\?n=[0-9]{0, 5}">).*(?=<\/a><span

这是另一个问题:
$url = "www.example.com/id/1234";
preg_match("/\d+(?<=id\/[\d])/",$url,$matches);

什么时候使用正面环视确实更好? 你可以举一些例子吗?

我意识到这与基于意见的问题接壤,但是我认为答案确实很有启发性。正则表达式足以使您感到困惑,而又不会使事情变得更复杂...我读过this page,并且对一些简单的指南(何时使用它们而不是它们如何工作)更感兴趣。

感谢所有的答复。除了以下内容之外,我建议您在此处检查m.buettner's great answer

最佳答案

  • 您可以捕获重叠的匹配项,并且可以找到可能位于其他匹配项环视中的匹配项。
  • 您可以表达关于匹配的复杂逻辑断言(因为许多引擎使您可以使用多个必须先匹配的lookbehind/lookahead断言,才能使匹配成功。)
  • Lookaround是表达常见约束条件“匹配X,如果后跟Y或在Y之前”的自然方法。添加多余的“匹配”部分(必须由后处理丢弃)是不那么自然的(可以说)。

  • 否定环视断言当然更有用。与#2结合使用,它们可以让您做一些漂亮的向导把戏,甚至在通常的程序逻辑中也很难表达。

    实例,按大众要求:
  • 重叠匹配:假设您要查找给定遗传序列中的所有候选基因。基因通常以ATG开始,以TAG,TAA或TGA结尾。但是,候选人可能会重叠:可能存在错误的开始。因此,您可以使用如下所示的正则表达式:
    ATG(?=((?:...)*(?:TAG|TAA|TGA)))
    

    这个简单的正则表达式将查找ATG起始密码子,然后是一定数量的密码子,然后是终止密码子。它提取出看起来像基因的所有内容(无密码子),并且即使它们重叠也可以正确输出基因。
  • 零宽度匹配:假设您要在计算机生成的HTML页面中查找具有特定类的每个tr。您可能会执行以下操作:
    <tr class="TableRow">.*?</tr>(?=<tr class="TableRow">|</table>)
    

    这处理了在行内出现裸</tr>的情况。 (当然,通常,HTML解析器是一个更好的选择,但是有时您只需要快速又肮脏的东西)。
  • 多个约束:假设您有一个文件,其数据带有id:tag1,tag2,tag3,tag4之类的标签,并且标签的顺序是任意的,并且您想查找标签为“green”和“egg”的所有行。提前两个即可轻松完成此操作:
    (.*):(?=.*\bgreen\b)(?=.*\begg\b)
    
  • 10-08 19:46