3

我对期望中的正则表达式有疑问,

我使用以下表达式:

expect {
    -re "PLAYER: (RON)_(\[0-9]*)"
    ###do something using switch
}

为了匹配输出的以下格式,输出"PLAYER:RON_90"的第一部分总是相同的:"PLAYER:RON_",但是它的第二部分(第一部分之后的名称)正在改变 alawys,有时是PLAYER:RON_90,有时是PLAYER:RON_87,,PLAYER:RON_75我想做不同的根据第二部分的第一个数字的动作,例如:如果是PLAYER:RON_second part(90到99),做动作1,如果是PLAYER:RON_second part(80到89),做动作2,如果是PLAYER:RON_second part(70到79),做行动3。

如何实现它?修改正则表达式?或其他一些方式?谁能帮忙?

4

2 回答 2

8

怎么样:

expect {
    -re {PLAYER RON_(\d+)} {
}

符号 \d+ 表示“至少一位十进制数字”。

更新:

expect -re {PLAYER RON_(\d+)} {
    set playerNumber $expect_out(1,string)
    set playerGroup [expr {$playerNumber / 10}]
    switch -- $playerGroup {
        8 { puts "80-89" }
        9 { puts "90-99" }
        10 { puts "100-109" }
    }
}

如果我们有匹配项,那么 playerNumber 将是紧随其后的数字,而 playerGroup 将是RON_查找的内容。

于 2012-06-18T15:09:03.017 回答
1

从手册页:

如果某个进程产生了输出“abbbcabkkkka\n”,则结果为:

expect -indices -re "b(b*).*(k+)"

就好像执行了以下语句:

set expect_out(0,start) 1
set expect_out(0,end) 10
set expect_out(0,string) bbbcabkkkk
set expect_out(1,start) 2
set expect_out(1,end) 3
set expect_out(1,string) bb
set expect_out(2,start) 10
set expect_out(2,end) 10
set expect_out(2,string) k
set expect_out(buffer) abbbcabkkkk

所以,对于下面的正则表达式...

    -re "PLAYER: (RON)_(\[0-9])(\[0-9]+)"

...你可以这样做:

    if {[info exists expect_out(1,string)]} {
        switch -- $expect_out(1,string) {
            case "9":
                // ...
            case "8":
                // ...
            case "7":
                // ...
        }
    }

同样,您可以通过检查来查看“额外”数字[info exists expect_out(2,string)]

于 2012-06-18T15:05:11.730 回答