计算Tcl 8.0上子串的出现次数

时间:2016-01-15 00:46:20

标签: string tcl

我试图找出一个字符串出现在另一个字符串中的次数,而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的效率如何。我有更好的选择吗?

1 个答案:

答案 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]}
}