在Tcl中匹配贪婪与非贪婪的操作

时间:2014-09-15 12:30:20

标签: regex tcl

假设我想要将文本与以下文本匹配,

[ 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 ]

这里的正则表达式都是为了让我得到结果,以了解匹配的文本是否可用。

让我们说我不关心子匹配文本,并假设文本将是一致的(即它在最后一个右方括号后没有任何东西。)。我说文本一致的原因是为了避免贪婪的运算符获得更多文本。

我认为,在这种情况下,两者都可以具有相同的含义。

可能很傻,但是哪个正则表达式在执行时间方面更有效率?

1 个答案:

答案 0 :(得分:1)

很难预测最快的RE会是什么,特别是当只有非常有限的输入时。正则表达式可以在开始时快速匹配,但通常较慢,或者快速匹配但速度慢,无法匹配,等等。您还必须注意捕获任何内容都会降低引擎速度,任何回溯也是如此。使用time命令进行调查。

% set length "\[ OK - 977613837 bytes \]"
[ OK - 977613837 bytes ]
% puts [regexp -inline {\[\s+OK\s+-\s+\d+\s+bytes\s+\]} $length]
{[ OK - 977613837 bytes ]}
% time {regexp -inline {\[\s+OK\s+-\s+\d+\s+bytes\s+\]} $length}
26 microseconds per iteration
% time {regexp -inline {\[\s+OK\s+-\s+\d+\s+bytes\s+\]} $length} 1000
8.996317 microseconds per iteration
% time {regexp -inline {\[\s+OK\s+-\s+\d+\s+bytes\s+\]} $length} 10000
6.5541893 microseconds per iteration
% time {regexp -inline {\[\s+OK\s+-\s+\d+\s+bytes\s+\]} $length} 100000
6.42272296 microseconds per iteration

(请注意,增加迭代次数会使每次迭代的时间更准确。)

一些一般要点:Tcl缓存已编译的RE,以便连续几次运行相同的RE很快。它有几种管理缓存的方法,但缓存在非常与文件中的RE或存储在全局/命名空间变量中(如果你不修改变量)

确保您在运行时间之前使用优化的Tcl版本。调试版本要慢得多。