TCL - 将字符串按任意数量的空格拆分为列表

6

假设我有一个这样的字符串:

set str "AAA    B C     DFG 142               56"

现在我想要获取以下列表:
{AAA B C DFG 142 56}

为此,我想使用split函数,但在这种情况下,我会得到一些额外的空列表{}。 我该如何获得上面的列表?
5个回答

15
set text "Some arbitrary text which might include \$ or {"
set wordList [regexp -inline -all -- {\S+} $text]

看这里:将字符串拆分为单词


哇,我不知道 regexp 可以返回一个列表。我本来会用这个方法,它几乎一样好 [split [regsub { {2,}} $string " "] " "]。regsub 替换所有长度为 2 或更多的空格序列为单个空格,然后 split 在该字符上拆分。 - drysdam
设定wordList [regexp -inline -all -- {\S+} $text] 这里的"--"代表什么意思? - Narek
3
如果正则表达式以 "-" 字符开头,这个操作是必要的,而且这也是一个良好的习惯(对于很多Tcl命令来说,第一个非开关参数可能来自用户输入,例如file delete -- $fileswitch -exact -- $word等)。 - glenn jackman
顺便提一下,请查看 https://dev59.com/FE_Ta4cB1Zd3GeqPAm-6 和 http://www.hume.com/html84/mann/regexp.html 了解-all和-inline标志。 - Narek

8
您可以始终执行以下操作:
set str "AAA    B C     DFG 142               56"
set newStr [join $str " "]

它将输出以下内容:
{AAA B C DFG 142 56}

为什么它能工作?我知道join - 通过连接列表元素创建字符串,但你的输出是一个列表?而且你的输入不是一个列表...这很奇怪... - Narek
字符串、列表,从技术上讲都是一样的东西。所给出的输出可以轻松地拆分为单独的列表元素等。但你想要的输出是一个列表,不是吗? - Scott
6
这个方法能够生效是因为输入可以被解析为一个有效的列表。如果输入是"AAA }B C DFG 142 56",它就会失败,因为这不能被解析为一个列表。 - RHSeeger

5

tcllib中的textutil::split模块有一个splitx过程,正好可以满足您的要求。

package require textutil::split
set result [textutil::split::splitx $str]

2
从Tcl 8.5开始,以下内容也可以工作:
list {*}$str

(假设字符串也是一个正确的列表,就像问题中所述一样)。输出是所需的列表。
文档: list{*}(语法)

1

我知道这已经过时了,但是以防其他人在未来遇到此问题,我会添加我的解决方案。我将未知数量的空格替换为一个空格字符,以使拆分函数能够正确工作,类似于Scott的答案:

set str "AAA    B C     DFG 142               56"    
regsub -all { +} $str " " str ; # str is now "AAA B C DFG 142 56"
set splitout [split $str { +}] ; # Split on one or more spaces. 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接