【问题标题】:Efficient way to match regex between delimiters在分隔符之间匹配正则表达式的有效方法
【发布时间】:2016-01-04 10:09:39
【问题描述】:

我有一个字符串,想用正则表达式匹配两个第一个分隔符之间的子字符串。

例如,带有分隔符" 的字符串foo"text"bar anotherfoo"anothertext"anotherbar 应该产生text

我找到了以下可能的解决方案:

  • 非贪婪匹配"(.*?)"
  • 与 Lookahead 和 Lookbehind 断言的非贪婪匹配 (?<=")(.*?)(?=")
  • 否定字符类"([^"]*)"

哪种方法最有效?还是我错过了这些解决方案表现不同的情况(假设设置了新行修饰符以使点与新行匹配)?

【问题讨论】:

  • JS、PHP、.NET 或 ..?
  • @choz 我在测试这个时正在使用 python。
  • 第二个在 JS 上不起作用。如果你比较它们,最后一个当然比第一个更好,因为它们是两种不同的方法。

标签: regex match


【解决方案1】:

由于分隔符是单个字符,并且匹配的子字符串不应包含它们,因此否定字符类解决方案("([^"]*)")是最有效的。

如果你只想匹配一次,你甚至不需要结束":只需使用"([^"]*)

惰性点匹配 ("(.*?)") 技术在没有结束分隔符且初始分隔符之后的文本相当大时可能会导致性能问题。

环视几乎总是涉及在每个测试位置检查某些子模式的额外开销。由于这里的分隔符是单个字符,所以这里的后向/前瞻效率不高。如果无法访问捕获组,您只想使用此解决方案。在 Python 中,捕获效果很好,因此无需使用此解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-11
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多