TCL / Regex - 从多行获取值

时间:2014-01-22 20:08:32

标签: regex tcl expect

这是我的输出:

Signal Quality  = 100
Signal Strength = -49
Noise Level     = -96

我正在尝试获取所有三个数值(即100,-49,-96)。我将添加和减去这些值,所以我需要各自的变量?

这些数字是动态的,可能是负数。

使用下面的代码,我当时可以抓一个,但是如何抓住所有3个数字呢?

expect {                    
    -re {Strength = +(.*)\s+Noise} {
        set RSSI $expect_out(1,string)
    }
    puts "Signal Strength = $RSSI"

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

要在一次expect通话中获取所有三个值,您需要一点点技巧。

# Initialize to an empty array
unset myAry
array set myAry {}

# Now let's expect some stuff!
expect {
    -re {(\w+)\s+=\s+(-?\d+)} {
        # Found it; stuff in an array
        set myAry($expect_out(1,string)) $expect_out(2,string)
        # TRICKY! Keep waiting if we've not yet got all three values
        if {[array size myAry] < 3} {
            exp_continue
        }
    }
}

使用衍生流程的输出,将myAry(Quality)设置为100,将myAry(Strength)设置为-49,将myAry(Level)设置为-96 }。要使用这两个单词,请将其用作模式:

{(\w+\s+\w+)\s+=\s+(-?\d+)}

然后你可能想要剥离空格:

set key [string map {{ } {}} $expect_out(1,string)]
set myAry($key) $expect_out(2,string)
# Now that optionally-keep-waiting stanza from above

当然,这可以是一个单行。我通常不喜欢我的台词。

答案 1 :(得分:0)

不确定tcl正则表达式,但这样的事情可能会奏效 这些数字按顺序位于捕获组1,2,3中 需要Dot-All或添加(?s)或将“.”更改为[\S\s]

 #  Quality\s*=\s*([+-]?\s*\d+)\s*.*?Strength\s*=\s*([+-]?\s*\d+).*?Level\s*=\s*([+-]?\s*\d+)


 Quality \s* = \s* 
 ( [+-]? \s* \d+ )              # (1)
 \s* 
 .*? 
 Strength \s* = \s* 
 ( [+-]? \s* \d+ )              # (2)
 .*? 
 Level \s* = \s* 
 ( [+-]? \s* \d+ )              # (3)