【问题标题】:Regexp: using lookahead assertion as condition正则表达式:使用前瞻断言作为条件
【发布时间】:2013-12-19 17:24:15
【问题描述】:

我相信下面的两个正则表达式做同样的事情:

\ba{3}\b

(?=\ba{3}\b).*

两者都只匹配第二个单词 (aaa):

zzz aaa bbb

我想知道在性能或任何其他方面之间是否有任何区别,或者出于某种原因是否比另一个更可取。

编辑:

确实,上面的模式匹配不同的东西(“aaa”和“aaa bbb”)。对不起,我的错。

我原来的模式是:

(?=^a{3}$).*
^a{3}$

我最初的示例主题是:

zzz
aaa
bbb

我认为这两种模式都匹配“aaa”。

我知道第二个更快。还有其他区别吗?

【问题讨论】:

  • 第二个正则表达式将匹配aaa bbb
  • 模式不同。但是,如果它们相同,则第一个是最快的。另一件事,第一个模式匹配第一个单词而不是第二个。
  • 谢谢你的回答,伙计们。

标签: php regex pcre lookaround


【解决方案1】:

正如 Jerry 在评论中指出的那样,第二个匹配 aaa bbb。但是,我个人认为\ba{3}\b.* 会更简单

【讨论】:

  • 哦,嘿,您更改了用户名和 gravatar o.o
【解决方案2】:

谈到正则表达式,我想到了三件事:

  1. 匹配域
  2. 复杂性
  3. 速度

任何正则表达式匹配所需字符串的简单性与其速度有直接关系,因此使用更少的表达式,您将在整个文本中搜索的速度更快。

有些表达式确实要花很多钱,所以在尝试选择正则表达式的最佳选择时,为什么要考虑更多?!

在正则表达式 ^a{3}$ 上,引擎会说:我是认真的!这很简单,只有一个明显的匹配域。

但是在第二个(?=^a{3}$).* 引擎中并不意味着它。它可能有很多匹配的案例,它具有积极的前瞻性并消耗更多的资源。

现在,你会爱上哪一个?

【讨论】:

    猜你喜欢
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多