检查字符串是否以TCL结尾的特定字符的最有效方法是什么?

Ani*_*ack 0 tcl

我想检查这个字符串模式是否"name.{j}.name.{i}.param""{i}.param"

Don*_*ows 5

进行此测试的最有效技术是使用string matchregexp.您也可以使用string laststring range测试它是否相等.

我们来试试吧!

建立

% set str "name.{j}.name.{i}.param"
name.{j}.name.{i}.param
% set pat "{i}.param"
{i}.param
Run Code Online (Sandbox Code Playgroud)

运用 string match

% string match *$pat $str
1
% time {string match *$pat $str} 10000
8.0875808 microseconds per iteration
Run Code Online (Sandbox Code Playgroud)

通过删除定时循环外的模式结构进行优化:

% set glob *$pat
*{i}.param
% time {string match $glob $str} 10000
5.4690824000000005 microseconds per iteration
Run Code Online (Sandbox Code Playgroud)

运用 string last

% expr {[string last $pat $str]==[string length $str]-[string length $pat]}
1
% time {expr {[string last $pat $str] == [string length $str]-[string length $pat]}} 10000
10.675282300000001 microseconds per iteration
Run Code Online (Sandbox Code Playgroud)

好的,这非常慢.让我们尝试分解一些计算:

% set len [expr {[string length $str] - [string length $pat]}]
14
% time {expr {[string last $pat $str] == $len}} 10000
6.8803367 microseconds per iteration
% time {expr {[string last $pat $str] == 14}} 10000 
6.835114999999999 microseconds per iteration
Run Code Online (Sandbox Code Playgroud)

更快,但没有那么快string match.如果模式不存在,则在长输入字符串上较慢.

运用 string range

% time {expr {[string range $str end-[expr {[string length $pat]-1}] end] eq $pat}} 10000
11.9834488 microseconds per iteration
Run Code Online (Sandbox Code Playgroud)

通过分解静态计算再次优化:

% set idx end-[expr {[string length $pat]-1}]
end-8
% time {expr {[string range $str $idx end] eq $pat}} 10000
7.7081886 microseconds per iteration
% time {expr {[string range $str end-8 end] eq $pat}} 10000
7.261692600000001 microseconds per iteration
Run Code Online (Sandbox Code Playgroud)

那是回到了球场,并且将具有一致的表现.

运用 regexp

请注意,我们需要做一些准备正则表达式的工作,因为它包含元字符但我们想要进行结束锚定匹配.该准备步骤本身很昂贵.

% time {regexp [regsub -all {\W} $pat {\\&}]$ $str} 10000
24.428607500000002 microseconds per iteration
Run Code Online (Sandbox Code Playgroud)

哦!ü!C!H!

让我们分析RE构造和重新定时:

% set RE [regsub -all {\W} $pat {\\&}]$
\{i\}\.param$
% regexp $RE $str
1
% time {regexp $RE $str} 10000
5.4204058 microseconds per iteration
Run Code Online (Sandbox Code Playgroud)

快速.但我们需要提前完成建设步骤.

摘要

虽然使用regexp速度很快,但由于准备步骤本身很昂贵,因此使用起来确实很棘手.我建议string match正常使用的方法.