将字符串拆分为用单引号括起来的单词

Split a string into words which are enclosed in single quotes

我想将一个字符串拆分成单独的单词,这些单词用单引号括起来,如下所示:

例如:

set str {'Name' 'Karna Mayer' ''}

我想把它分成 3 个单独的词。如何使用 Tcl 执行此操作。

您可以使用字符串映射将单引号转换为双引号并转义现有引号

set str [string map {{"} {\"} ' {"}} $str]
# "name" "Karna Mayer" ""

然后您可以使用 list 和参数扩展将其转换为列表

set l [list {*}$str]
# Name {Karna Mayer} {}

完整节目

set str {'Name' 'Karna Mayer' ''}
set str [string map {{"} {\"} ' {"}} $str]
set l [list {*}$str]

对于这类任务,我会使用 regexp -all -inlinelmap(从结果中删除不需要的位)。

set input "'Name' 'Karna Mayer' ''"
set output [lmap {- bit} [regexp -all -inline {'([^'']*)'} $input] {set bit}]

这样做的好处是,如果您有办法转义其中的单引号,则可以使用更复杂的正则表达式并匹配它。

set output [lmap {- bit} [regexp -all -inline {'((?:\.|[^''])*)'} $input] {
    string map {\ {}} $bit
}]

如果您使用单引号作为分隔符,那么您将使用每个 元素:

% set input "'Name' 'Karna Mayer' ''"
'Name' 'Karna Mayer' ''
% split $input {'}
{} Name { } {Karna Mayer} { } {} {}

我们看到:第一个引号前的空字符串;第一个字段;第 1 和第 2 之间的 space;第二场;下一个space; (空)第三场;然后是最后一个引号后的空字符串。我们想忽略最后一个元素。

% set fields [lmap {_ field} [lrange [split $input {'}] 0 end-1] {set field}]
Name {Karna Mayer} {}

不用了,感谢 Tcl 语法荧光笔。