【发布时间】:2014-09-15 12:30:19
【问题描述】:
假设我想匹配一个文本下面的文本,
[ OK - 977613837 bytes ]
我可以通过多种方式编写正则表达式。考虑以下代码,
set length "\[ OK - 977613837 bytes \]"
puts $length
#can be many ways, I am just keeping 2, to have it for question's sake
puts [ regexp -inline {\[\s+OK\s+-\s+\d+\s+bytes\s+\]} $length ]
puts [ regexp -inline {\[.*OK.*\d+.*bytes.*\]} $length ]
这两个正则表达式都可以让我知道匹配的文本是否可用。
假设我不关心子匹配文本并假设文本将是一致的(即在最后一个右方括号之后不会有任何内容。)。我之所以说文本将是一致的,是为了避免贪婪的运算符获得更多的文本。
我相信在这种情况下,在这个给定的条件下,两者可以具有相同的含义。
问起来可能有点傻,但就执行时间而言,哪个正则表达式更有效?
【问题讨论】:
-
我推荐这个
puts [ regexp -inline {\[\s+OK\s+\-\s+\d+\s+bytes\s+\]} $length ],因为使用这个正则表达式可以避免回溯。 -
好问题。测试了一下,发现了一些令我惊讶的结果。到目前为止,最快的是使用
{\[\s*OK\s*-\s*\d+\s*bytes\s*\]}。 -
嗯,实际上,
{\[\s*OK\D*\d+\s*bytes\s*\]}是当前最快的.。 -
@Jerry:只有最后一个会匹配很多不是空格单破折号空格的字符串。
-
@Dinesh,实际上我在对您问题的第二条评论中隐藏了一个链接。尝试将鼠标悬停在“最快”之后的点上,您将获得一个链接,我在其中计时了 5 个不同的正则表达式。你也许可以选择你喜欢的:)