tcl:将字符串解析为列表

时间:2013-08-23 15:23:23

标签: regex tcl

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

字符串的格式为

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

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

{name1 value1 name2 value2 name3 value3}

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

3 个答案:

答案 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]