我有一个可能很大的文本块来搜索[[...]]
的实例,其中...
可以是任何东西,包括其他方括号(尽管它们不能嵌套; ]]
结束匹配后的第一个[[
实例)。
我可以想到两种匹配此文本的方法:
/\[\[.+?\]\]/
/\[\[(?:(?!\]\]).)+\]\]/
从性能的角度来看,一个选择在本质上优于另一个选择吗?(我想说第一个选择可能更具可读性)?我记得曾经读过,最好不要使用非贪婪的限定词,但是现在我找不到它的来源。
最佳答案
在这种情况下,最好使用非贪婪量词。
以这个示例字符串"[[a]b]]"
为例
非贪婪量词
\[\[。+?\]\]
原子#1 2 3 4 5
\[
与\[
与.+?
与"a"
匹配\]
与\]
失败,返回到#3,但保留字符串位置.+?
与"]"
匹配\]
失败,返回到#3,但保留字符串位置.+?
与"b"
匹配\]
与\]
与展望:
\[\[(?:(?!\]\])。)+\]\]
原子#1 2 3 4 5 6 7
\[
与\[
与(?!\]\])
立即在"a"
成功(即不匹配),继续.
与"a"
相匹配,在#3 (?!\]\])
在"]"
上实现了部分匹配(?!\]\])
在"b"
成功(即不匹配),继续.
与"]"
相匹配,在#3 (?!\]\])
立即在"b"
成功(即不匹配),继续.
与"b"
相匹配,在#3 (?!\]\])
在"]"
上实现了部分匹配(?!\]\])
在"]"
处完全匹配,因此:#4失败,退出#3 \]
与\]
与因此,看起来非贪婪量词的工作量较少。
免责声明:这是一个人工示例,实际性能可能会有所不同,具体取决于输入,正则表达式和正则表达式引擎的实现。我只有98%的人确定我在这里概述的是实际发生的情况,因此我愿意进行更正。此外,与所有性能提示一样,不要一无所获,如果您想确定的话,请进行自己的基准比较。