【问题标题】:How to match 'a' or '^' [duplicate]如何匹配'a'或'^' [重复]
【发布时间】:2020-05-26 13:06:51
【问题描述】:

对于这个问题,我回答了 a|\^,但被告知预期的答案是 [a^] 后一种解决方案是否比前一种更有效?

【问题讨论】:

标签: regex


【解决方案1】:

这两种解决方案都是有效的,并且从根本上实现了相同的目标。 [a^] 可能 效率更高,具体取决于所讨论的正则表达式实现——解析正则表达式时,引擎知道[] 中的任何内容都必须匹配单个字符,而| 可以处理任意-长度替代方案——然而,这纯粹是推测,我敢猜测大多数真正的正则表达式引擎都能非常有效地处理这种常见情况。除非您打算通过benchmark your code 确定哪些部分是瓶颈,否则它们可以被认为是等效的。

还有一些其他的小权衡;例如,[a^] 不需要包裹在 () 中,如果您将它放在某物旁边,但 a|\^ 需要。 IMO,[a^] 令人困惑,因为看起来有人试图写[^a](除a 之外的任何字符)但打错了。但是,(?:a|\^) 非常冗长。权衡这些权衡是一种风格/主观问题。

【讨论】:

  • 谢谢,能否请您解释一下 [a^] 如何比 a|\^ 更高效
【解决方案2】:

| 运算符匹配两个表达式中的任何一个。例如,hello|w.[4] 将匹配:

hello
world
warst

[ba\^] 匹配[] 之间的任何字符。例如[ba\^] 将匹配:

b
a
^

对于您介绍的情况,它们本质上是相同的。至于性能,我使用 JavaScript 进行了基准测试,结果不一致。虽然,我不认为一个与另一个有很大的性能差异。您可以查看我如何对其进行基准测试here

【讨论】:

    【解决方案3】:
    Comparison:
                a|\^:    23518.6 i/s
                [a^]:    22498.6 i/s - same-ish: difference falls within error
    

    关于你的效率问题,我运行的测试没有太大的性能差异,尽管你可以做一些更密集的性能测试。上面的测试结果基于使用 ruby​​ 的 articlebenchmark-ips gem。

    【讨论】:

    • 您使用什么语言/库运行此测试?否则就没意义了:)
    • 如上所述,我的性能测试基于使用 ruby​​ 和 benchmark-ips gem 的链接文章。我将更新帖子以明确说明,因此您不必单击链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2019-02-13
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    相关资源
    最近更新 更多