我正在尝试将字符串解析为TCL中的平面列表。
字符串的格式为
name1='value1',name2='value2',name3='value3'
我想知道是否有办法将名称和值捕获到如下所示的列表中:
{name1 value1 name2 value2 name3 value3}
请注意,名称或值本身可能包含任何字符,例如'
或=
或,
答案 0 :(得分: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
)。
答案 1 :(得分: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"
答案 2 :(得分:0)
您可以使用否定字符类
来执行此操作set s {name1='value1',name2='value2',name3='value3'}
set result [regexp -inline -all -- {[^=',]+} $s]