我试图找出一个字符串出现在另一个字符串中的次数,而Tcl似乎没有内置的字符串。我无法使用wiki上的任何一种解决方案,因为我必须支持Tcl 8.0。
这不起作用:
# needleString is known to contain no regex metacharacters
llength [regexp -all -inline $needleString $haystackString]
因为8.0不支持-all
。
这不起作用:
proc string_occurrences {needleString haystackString} {
set j [string first $needleString $haystackString 0]
if {$j == -1} {return 0}
set i 0
while {$j != -1 } {
set j [string first $needleString $haystackString [incr j]]
incr i
}
return $i
}
因为string first
不支持8.0上的startIndex
参数。
我可以修改string_occurrences
以使用string range
来获取字符串的子字符串和2参数string first
来搜索其中的内容,但这比循环更麻烦已经是,而且我不知道string range
的效率如何。我有更好的选择吗?
答案 0 :(得分:2)
您可以使用[regsub -all]
(8.0中存在)创建一个删除了needleString的新字符串,并比较长度:
proc string_occurrences {needleString haystackString} {
regsub -all $needleString $haystackString {} stripped
expr {([string length $haystackString] - [string length $stripped]) / [string length $needleString]}
}