你能解释一下这是怎么回事吗?下面是一个示例:
<!-- The quick brown fox
jumps over the lazy dog -->
<!--[if IE 7]>
<link rel="stylesheet" type="text/css" href="/supersheet.css" />
<![endif]-->
<!-- Pack my box with five dozen liquor jugs -->首先,我尝试使用以下正则表达式来匹配条件注释中的内容:
/<!--.*?stylesheet.*?-->/s它失败了,因为正则表达式匹配第一个<!--和最后一个-->之前的所有内容。然后,我尝试使用另一种具有前瞻性断言的模式:
/<!--(?=.*?stylesheet).*?-->/s它的工作原理与我所需要的完全吻合。但是,以下正则表达式也可以工作:
/<!--(?=.*stylesheet).*?-->/s最后一个正则表达式在展望断言中没有不情愿的量词。现在我很困惑。有人能解释一下它的工作原理吗?也许这个例子有更好的解决方案?
更新:
我尝试在另一个文档中使用具有前瞻性断言的usig正则表达式,但它未能在注释之间映射内容。因此,这个/<!--(?=.*?stylesheet).*?-->/s (以及这个/<!--(?=.*stylesheet).*?-->/s)是不正确的。不要使用它,并尝试其他建议。
更新:
Jonny 5已经找到了解决方案(见答案)。他提出了三个备选方案:
/style-sheet.css,它将无法工作。\K。就像一种魅力。缺点如下:
我认为以下是我的例子的一个很好的解决方案:
/(?s)<!--(?:(?!<!).)+?stylesheet.+?-->/s修饰符的结尾处也是这样:
/<!--(?:(?!<!).)+?stylesheet.+?-->/s正如我所说的,这是一个很好的解决方案,但我设法改进了模式,并找到了另一个在我的例子中工作得更快的模式。
因此,最后的解决方案如下:
/<!--(?:(?!-->).)+?stylesheet.+?-->/s感谢所有参与者给出有趣的答案。
发布于 2015-08-16 08:01:01
要只匹配部分<!--...stylesheet...-->,有许多方法:
1.)使用否定连字符[^-]限制比赛,并在<!--和stylesheet之间停留
(?s)<!--[^-]+stylesheet.+?-->[^-]只允许字符,这些字符不是连字符。见regex101测试。
2.)要获得“最后”或最接近的匹配而无需付出很大的努力,也可以在贪婪 点之前将ᗧ吃掉。如果不匹配全局/只匹配一个项,则有意义。在贪婪之后使用\K重设:
(?s)^.*\K<!--.+?stylesheet.+?-->见regex101测试。也可以使用抓捕小组并获得1美元: (?s)^.*(<!--.+?stylesheet.+?-->)
3.)使用前瞻缩小范围通常成本更高:
(?s)<!--(?:(?!<!).)+?stylesheet.+?-->见regex101测试。(?!<!).展望了<!--和stylesheet之间的每一个字符,如果没有开始另一个<!.呆在一个元素里。类似于否定的连字符解。
我使用的不是.*,而是一个或多个.+ --取决于匹配的是什么。在这里,+更适合。
使用什么解决方案取决于确切的需求。在这种情况下,我会使用第一个。
https://stackoverflow.com/questions/32031058
复制相似问题