Regex tcl:将字符串解析为列表
我正在尝试将字符串解析为TCL中的平面列表 字符串的格式为Regex tcl:将字符串解析为列表,regex,tcl,Regex,Tcl,我正在尝试将字符串解析为TCL中的平面列表 字符串的格式为 name1='value1',name2='value2',name3='value3' 我想知道是否有一种方法可以将名称和值捕获到如下列表中: {name1 value1 name2 value2 name3 value3} 请注意,名称或值本身可能包含任何字符,如'或=或,最简单的方法是用空格替换符号=,,和': % set s {name1='value1',name2='value2',name3='value3'} nam
name1='value1',name2='value2',name3='value3'
我想知道是否有一种方法可以将名称和值捕获到如下列表中:
{name1 value1 name2 value2 name3 value3}
请注意,名称或值本身可能包含任何字符,如
'
或=
或,
最简单的方法是用空格替换符号=
,,
和'
:
% 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
字符串映射
采用两个参数。第一个是新旧字符串对的列表。第二个是字符串本身。本质上,stringmap
将搜索旧字符串并用新字符串替换它们。例如,它将搜索='
,并替换为
(空格)
更新
上述解决方案假定名称或值中没有空格。以下解决方案适用于具有嵌入空间的值:
% 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 data {name1='value1',name2='value2',name3='value3'}
foreach {- key value -} [regexp -all -inline {(.*?)='(.*?)'(,|$)} $data] {
lappend result $key $value
}
注意:如果该键只出现一次,我建议使用dict(
dict set result$key$value
)。您可以使用负数字符类执行此操作
set s {name1='value1',name2='value2',name3='value3'}
set result [regexp -inline -all -- {[^=',]+} $s]
您如何确保字符串将正确解析到列表中?通过我的上述评论,我的意思是,您如何知道字符串中的名称和值是什么,例如:
name1,name1cont='name1cont',='value1',value1cont.='value1cont.='value1cont.
,其中名称和值可以包含,=
或,
?因此name1='value1',name2='value2',name3='value3'
具有值为value1',name2='value2',name3='value3
的键name1
?我在这里假设了最坏的情况。名称和值中不能有='
或'、
。@JohannesKuhn不,每个键都应该有自己的值。谢谢,它可以工作。但是我不太明白?
里面的(.*)
。非贪婪。不要试图匹配尽可能多的字符,否则您会得到类似于name1='value1',name2='value2',name3=
作为键和'value3'
作为值的内容,这不是您想要的。我猜您错过了键和值也可以包含',
或=
它将使用反斜杠='\'\'
或{='curly'
之类的输入中断。是的。我确实错过了。否。如果名称/值包含=
,'
或,