gpt4 book ai didi

string - 如何在 TCL 中将字符串拆分为单词列表,忽略多个空格?

转载 作者:行者123 更新时间:2023-12-02 11:43:07 28 4
gpt4 key购买 nike

基本上,我有一个由多个空格分隔的单词组成的字符串。然而,问题是,单词之间可以有多个空格,而不仅仅是一个空格。这就是为什么 [split] 没有做我想要的事情:

split "a    b"

给了我这个:

{a {} {} {} b}

而不是这个:

{a b}

搜索 Google,我发现 a page on the Tcler's wiki ,其中用户询问了或多或少相同的问题。

一个建议的解决方案如下所示:

split [regsub -all {\s+} "a    b" " "]

这似乎适用于简单的字符串。但是,诸如 [string Repeat ""4] 之类的测试字符串(使用字符串重复,因为 StackOverflow 会删除多个空格)将导致 regsub 返回“”,从而将 分割 将再次拆分为 {{} {}} 而不是空列表。

另一个建议的解决方案是这个,强制将给定字符串重新解释为列表:

lreplace "a   list   with many   spaces" 0 -1

但是,如果说我从 TCL 学到了一件事,那就是永远不应该在字符串上使用列表函数(以 l 开头)。事实上,这个会因为包含特殊字符(即 { 和 })的字符串而卡住:

lreplace "test    \{a b\}"

返回 test {a b} 而不是 test\{a b\} (这就是我想要的,每个空格分隔的单词都分成单个元素结果列表)。

另一种解决方案是使用“过滤器”:

proc filter {cond list} {
set res {}
foreach element $list {if [$cond $element] {lappend res $element}}
set res
}

然后你可以像这样使用它:

filter llength [split "a   list   with many   spaces"]

同样的问题。这将在字符串上调用 llength ,该字符串可能包含特殊字符(同样,{ 和 }) - 传递它“\{a b\}”将导致 TCL 提示“列表中不匹配的左大括号” ”。

我设法通过修改给定的 filter 函数,在 if 中的 $cond 前面添加一个 {*} 来让它工作,这样我就可以将它与 string length 而不是 llength,它似乎适用于迄今为止我尝试使用它的所有可能的输入。

这个解决方案现在可以安全使用吗?它会因为一些我尚未测试过的特殊输入而窒息吗?或者,是否有可能以更简单的方式正确做到这一点?

最佳答案

最简单的方法是使用regexp -all -inline来选择并返回所有单词。例如:

# The RE matches any non-empty sequence of non-whitespace characters
set theWords [regexp -all -inline {\S+} $theString]

如果您将单词定义为字母数字序列,则可以将其用作正则表达式术语:{\w+}

关于string - 如何在 TCL 中将字符串拆分为单词列表,忽略多个空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13380914/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com