在TCL中,检查字符串是否以特定字符开头的最有效方法是什么?

8
我有一个字符串,想要检查它是否以某个字符(在这种情况下是“#”)开头。我想知道最有效的方法是什么!
我想到的是if {[string compare -length 1 $string "#"]},因为它可能使用strcmp(),这可能是最快的实现方式之一。
我认为还有可能的是if {[string index $string 1] == "#"},因为它可能会执行*string == '#',这也可能非常快。
你觉得呢?

1
虽然 string compare -length 最终使用了类似于 strncmp() 的函数,但它必须比你想象的更加小心,因为 Tcl 使用 Unicode 字符而不是 ASCII,并且 NUL 是 Tcl 字符串中的合法字符。 - Donal Fellows
2个回答

21

检查字符串是否以特定字符开头的最快方法是使用string match函数:

if {[string match "#*" $string]} { ... }

匹配的代码看到第一个字符后有一个星号,然后是字符串的末尾,因此停止检查$string的其余部分。它也不需要分配结果(除了布尔类型,这是一种特殊情况,因为string match也是字节码编译的)。


虽然“string match”是我能想到的最直观的东西,但有趣的是它也很高效。我本以为它的性能会比较差,因为它必须解析各种通配符和其他东西。好吧,现在我正在使用“string match”,谢谢! - Jerry
@Jerry:在匹配器代码中,“结尾通配符”是一个特殊情况。 - Donal Fellows
我想检查字符串是否以字符 * 开头,但 * 可以匹配字符串中的任何内容。 - undefined

-2

是的,[string match "*" $string_name] 这就是对我有效的方法。与 regexp 或任何其他工具相比,这真的很快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接