我试图弄清楚一个字符串在另一个字符串中发生了多少次,而Tcl似乎没有内置。我不能在维基上使用这两种解决方案,因为我必须支持TCL8.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的效率有多高。我还有更好的选择吗?
发布于 2016-01-15 01:53:57
您可以使用[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]}
}https://stackoverflow.com/questions/34802514
复制相似问题