首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RegExp练习:不愿使用前瞻性断言的量词

RegExp练习:不愿使用前瞻性断言的量词
EN

Stack Overflow用户
提问于 2015-08-16 01:34:01
回答 1查看 210关注 0票数 4

你能解释一下这是怎么回事吗?下面是一个示例:

代码语言:javascript
复制
<!-- 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 -->

首先,我尝试使用以下正则表达式来匹配条件注释中的内容:

代码语言:javascript
复制
/<!--.*?stylesheet.*?-->/s

它失败了,因为正则表达式匹配第一个<!--和最后一个-->之前的所有内容。然后,我尝试使用另一种具有前瞻性断言的模式:

代码语言:javascript
复制
/<!--(?=.*?stylesheet).*?-->/s

它的工作原理与我所需要的完全吻合。但是,以下正则表达式也可以工作:

代码语言:javascript
复制
/<!--(?=.*stylesheet).*?-->/s

最后一个正则表达式在展望断言中没有不情愿的量词。现在我很困惑。有人能解释一下它的工作原理吗?也许这个例子有更好的解决方案?

更新:

我尝试在另一个文档中使用具有前瞻性断言的usig正则表达式,但它未能在注释之间映射内容。因此,这个/<!--(?=.*?stylesheet).*?-->/s (以及这个/<!--(?=.*stylesheet).*?-->/s)是不正确的。不要使用它,并尝试其他建议。

更新:

Jonny 5已经找到了解决方案(见答案)。他提出了三个备选方案:

  1. 使用否定的连字符限制匹配。只有在标签之间没有连字符的情况下,此选项才能工作。如果样式表有一个URL /style-sheet.css,它将无法工作。
  2. 使用转义序列:\K。就像一种魅力。缺点如下:
    • 它非常慢(在我的例子中,它比其他解决方案慢8-10倍)
    • 只有在PHP 5.2.4之后才可用

  1. 用放眼的眼光缩小比赛范围。这是我试图达到的目标,但我对使用lookaround断言的补偿不足以完成任务。

我认为以下是我的例子的一个很好的解决方案:

代码语言:javascript
复制
/(?s)<!--(?:(?!<!).)+?stylesheet.+?-->/

s修饰符的结尾处也是这样:

代码语言:javascript
复制
/<!--(?:(?!<!).)+?stylesheet.+?-->/s

正如我所说的,这是一个很好的解决方案,但我设法改进了模式,并找到了另一个在我的例子中工作得更快的模式。

因此,最后的解决方案如下:

代码语言:javascript
复制
/<!--(?:(?!-->).)+?stylesheet.+?-->/s

感谢所有参与者给出有趣的答案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-16 08:01:01

要只匹配部分<!--...stylesheet...-->,有许多方法:

1.)使用否定连字符[^-]限制比赛,并在<!--stylesheet之间停留

代码语言:javascript
复制
(?s)<!--[^-]+stylesheet.+?-->

[^-]只允许字符,这些字符不是连字符。见regex101测试

2.)要获得“最后”或最接近的匹配而无需付出很大的努力,也可以在贪婪 之前将ᗧ吃掉。如果不匹配全局/只匹配一个项,则有意义。在贪婪之后使用\K重设

代码语言:javascript
复制
(?s)^.*\K<!--.+?stylesheet.+?-->

regex101测试。也可以使用抓捕小组并获得1美元: (?s)^.*(<!--.+?stylesheet.+?-->)

3.)使用前瞻缩小范围通常成本更高:

代码语言:javascript
复制
(?s)<!--(?:(?!<!).)+?stylesheet.+?-->

regex101测试(?!<!).展望了<!--stylesheet之间的每一个字符,如果没有开始另一个<!.呆在一个元素里。类似于否定的连字符解。

我使用的不是.*,而是一个或多个.+ --取决于匹配的是什么。在这里,+更适合。

使用什么解决方案取决于确切的需求。在这种情况下,我会使用第一个。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32031058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档