我正在尝试将字符串解析为 TCL 中的平面列表。
该字符串的格式为
name1='value1',name2='value2',name3='value3'
我想知道是否有办法将名称和值捕获到如下所示的列表中:
{name1 value1 name2 value2 name3 value3}
请注意,名称或值本身可能包含任何包含'
或=
或之类的字符,
嗯,可能
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
)。
最简单的方法是替换符号=
,,
和'
空格:
% 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"
你可以用一个否定的字符类来做到这一点
set s {name1='value1',name2='value2',name3='value3'}
set result [regexp -inline -all -- {[^=',]+} $s]