正则表达式前瞻为什么

Regex lookahead why

对于PCRE,以下两个正则表达式有什么区别? (?=<!--)([\s\S]*?-->)(<!--[\s\S]*?-->)

第一个匹配HTML评论提到HERE

这两个模式将匹配相同的东西。这是第一个模式的解释:

(?=<!--)         assert that what immediately follows is <!--
([\s\S]*?-->)    then capture everything, across lines if necessary,
                 until reaching the first -->

第二个模式不使用前瞻,而是只匹配一个 HTML 评论:

(<!--[\s\S]*?-->)

同样,此模式将跨行匹配。

我希望这两种模式具有相似的性能。您选择什么将取决于哪个对您的数据执行得更好、您使用的工具(并非所有正则表达式引擎都支持 lookarounds)以及您发现哪种模式更容易阅读。