最近,许多正则表达式问题在查询中都具有某种环顾四周的元素,对我而言,这对成功匹配不是必需的。有什么教学资源可以促进他们吗?我正在尝试通过积极的前瞻性了解到底哪种情况会更好。我可以看到的主要应用程序是尝试不匹配元素时。但是,例如,这个来自最近一个问题的查询提供了一种简单的解决方案来捕获.*
,但是为什么要背后看呢?
(?<=<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。
最佳答案
否定环视断言当然更有用。与#2结合使用,它们可以让您做一些漂亮的向导把戏,甚至在通常的程序逻辑中也很难表达。
实例,按大众要求:
ATG(?=((?:...)*(?:TAG|TAA|TGA)))
这个简单的正则表达式将查找ATG起始密码子,然后是一定数量的密码子,然后是终止密码子。它提取出看起来像基因的所有内容(无密码子),并且即使它们重叠也可以正确输出基因。
tr
。您可能会执行以下操作:<tr class="TableRow">.*?</tr>(?=<tr class="TableRow">|</table>)
这处理了在行内出现裸
</tr>
的情况。 (当然,通常,HTML解析器是一个更好的选择,但是有时您只需要快速又肮脏的东西)。 id:tag1,tag2,tag3,tag4
之类的标签,并且标签的顺序是任意的,并且您想查找标签为“green”和“egg”的所有行。提前两个即可轻松完成此操作:(.*):(?=.*\bgreen\b)(?=.*\begg\b)