解析tcl中字符串中的所有匹配项

时间:2014-02-26 17:10:02

标签: string tcl

我有一个字符串如下

set temp "
temp   : value
temp1  : value1
tempvalue
abc    = 23:445:726
abcdef = 456::985
abcdef = 123:45:7
abcdef = 098:45:56:8
"

在这里我想要一个输出,其中“=”之后的值应该设置为一个变量。输出应该是

"456::985 123:45:7 098:45:56:8".

我用过

set result [regexp "abcdef\\s*=\\s*(\\S*)" $temp match v1]

但无法全部获得

我使用带有-inline -all和-line的regexp得到答案,将结果存储在列表中,然后遍历它以获取值。我需要一个班轮

set result [regexp -inline -all -line "abcdef\\s*=\\s*(\\S*)" $temp]

输出

{abcdef = 456::985} 456::985 {abcdef = 123:45:7} 123:45:7 {abcdef = 098:45:56:8} 098:45:56:8

然后遍历这个以将它们全部设置在一个字符串中。但我想知道是否有任何简单的方法来做到这一点。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

鉴于此示例,您不需要regexp。将线分成几部分并创建一个新列表。

set r {}
foreach line [split $temp \n] {
    if {[string trim $line] eq ""} continue;             # skip blank lines
    lappend r [string trim [lindex [split $line =] end]]
}
puts $r

这将给出一个列表,其中只有等号后面的位。如果将其视为字符串,则它将作为字符串使用,列表中的每个元素用空格分隔。

答案 1 :(得分:0)

由于您正在使用面向行的匹配,因此请利用行锚:

% regexp -inline -all -line {\S+$} $temp
456::985 123:45:7 098:45:56:8

因此,要将值保存为字符串

set values [join [regexp -inline -all -line {\S+$} $temp]]

如果等于之后可能没有空格,请使用模式{[^=\s]+$}

我的整个答案假设每行只有一个等号。


回应更新的样本输入:

foreach {m word} [regexp -inline -all -line {=\s*(\S+)$} $temp] {
    lappend words $word
}
puts [join $words]
23:445:726 456::985 123:45:7 098:45:56:8

答案 2 :(得分:0)

这是另一种方法:将每一行视为3个令牌:键,等号和值:

set result {}
foreach {key eq_sign value} $temp { lappend result $value }

这种方法很容易理解,但如果值包含空格则不起作用。