我有一个字符串如下
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
然后遍历这个以将它们全部设置在一个字符串中。但我想知道是否有任何简单的方法来做到这一点。 提前谢谢。
答案 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 }
这种方法很容易理解,但如果值包含空格则不起作用。