Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex tcl:将字符串解析为列表_Regex_Tcl - Fatal编程技术网

Regex 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

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

字符串的格式为

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'
之类的输入中断。是的。我确实错过了。否。如果名称/值包含
=
'