1

我正在尝试将字符串解析为 TCL 中的平面列表。

该字符串的格式为

name1='value1',name2='value2',name3='value3'

我想知道是否有办法将名称和值捕获到如下所示的列表中:

{name1 value1 name2 value2 name3 value3}

请注意,名称或值本身可能包含任何包含'=或之类的字符,

4

3 回答 3

2

嗯,可能

set data {name1='value1',name2='value2',name3='value3'}
foreach {- key value -} [regexp -all -inline {(.*?)='(.*?)'(,|$)} $data] {
    lappend result $key $value
}

注意:如果密钥只出现一次,我建议使用 dicts ( dict set result $key $value)。

于 2013-08-23T16:47:43.667 回答
0

最简单的方法是替换符号=,,'空格:

% set s {name1='value1',name2='value2',name3='value3'}
name1='value1',name2='value2',name3='value3'

% set new_s [string map {"='" " " "'," " " "'" " "} $s]
name1 value1 name2 value2 name3 value3

string map接受两个参数。第一个是新旧字符串对的列表。第二个是字符串本身。本质上,string map将搜索旧字符串并用新字符串替换它们。例如,它将搜索='并替换为(空格)。

更新

上述解决方案假定名称或值中没有空格。以下解决方案适用于带有嵌入空格的值:

% set s {name1='value1',name2='value 2',name3='value3'}
name1='value1',name2='value2',name3='value3'

% string map {"=" " " "'" {"} "," " "} $s
name1 "value1" name2 "value 2" name3 "value3"
于 2013-08-23T16:40:00.157 回答
0

你可以用一个否定的字符类来做到这一点

set s {name1='value1',name2='value2',name3='value3'}
set result [regexp -inline -all -- {[^=',]+} $s]
于 2013-08-23T18:45:13.947 回答