首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Tcl 8.0上计数子字符串的出现

在Tcl 8.0上计数子字符串的出现
EN

Stack Overflow用户
提问于 2016-01-15 00:46:19
回答 1查看 2.3K关注 0票数 3

我试图弄清楚一个字符串在另一个字符串中发生了多少次,而Tcl似乎没有内置。我不能在维基上使用这两种解决方案,因为我必须支持TCL8.0。

这不管用:

代码语言:javascript
复制
# needleString is known to contain no regex metacharacters
llength [regexp -all -inline $needleString $haystackString]

因为8.0不支持-all

这不管用:

代码语言:javascript
复制
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的效率有多高。我还有更好的选择吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-15 01:53:57

您可以使用[regsub -all] (出现在8.0中)创建一个删除了needleString的新字符串,并比较长度:

代码语言:javascript
复制
proc string_occurrences {needleString haystackString} {
    regsub -all $needleString $haystackString {} stripped
    expr {([string length $haystackString] - [string length $stripped]) / [string length $needleString]}
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34802514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档