我有一个可能很大的文本块来搜索[[...]]的实例,其中...可以是任何东西,包括其他方括号(尽管它们不能嵌套; ]]结束匹配后的第一个[[实例)。

我可以想到两种匹配此文本的方法:

  • 使用非贪婪的限定词:/\[\[.+?\]\]/
  • 使用前瞻:/\[\[(?:(?!\]\]).)+\]\]/

  • 从性能的角度来看,一个选择在本质上优于另一个选择吗?(我想说第一个选择可能更具可读性)?我记得曾经读过,最好不要使用非贪婪的限定词,但是现在我找不到它的来源。

    最佳答案

    在这种情况下,最好使用非贪婪量词。

    以这个示例字符串"[[a]b]]"为例

    非贪婪量词

    \[\[。+?\]\]
    原子#1 2 3 4 5

  • Atom#1 \[
  • 匹配
  • Atom#2 \[
  • 匹配
  • Atom#3 .+?"a"匹配
  • Atom#4 \]
  • 匹配
  • Atom#5 \]失败,返回到#3,但保留字符串位置
  • Atom#3 .+?"]"匹配
  • Atom#4 \]失败,返回到#3,但保留字符串位置
  • Atom#3 .+?"b"匹配
  • Atom#4 \]
  • 匹配
  • Atom#5 \]
  • 匹配
  • 成功

  • 展望:

    \[\[(?:(?!\]\])。)+\]\]
    原子#1 2 3 4 5 6 7
  • Atom#1 \[
  • 匹配
  • Atom#2 \[
  • 匹配
  • Atom#4 (?!\]\])立即在"a"成功(即不匹配),继续
  • Atom#5 ."a"相匹配,在#3
  • 处重复
  • Atom#4 (?!\]\])"]"上实现了部分匹配
  • Atom#4 (?!\]\])"b"成功(即不匹配),继续
  • Atom#5 ."]"相匹配,在#3
  • 处重复
  • Atom#4 (?!\]\])立即在"b"成功(即不匹配),继续
  • Atom#5 ."b"相匹配,在#3
  • 处重复
  • Atom#4 (?!\]\])"]"上实现了部分匹配
  • Atom#4 (?!\]\])"]"处完全匹配,因此:#4失败,退出#3
  • Atom#6 \]
  • 匹配
  • Atom#7 \]
  • 匹配
  • 成功

  • 因此,看起来非贪婪量词的工作量较少。

    免责声明:这是一个人工示例,实际性能可能会有所不同,具体取决于输入,正则表达式和正则表达式引擎的实现。我只有98%的人确定我在这里概述的是实际发生的情况,因此我愿意进行更正。此外,与所有性能提示一样,不要一无所获,如果您想确定的话,请进行自己的基准比较。

    09-20 15:38