3

期待する正規表現について質問があります。

私は次の表現を使用します。

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

出力の次の形式に一致させるために、出力の最初の部分"PLAYER:RON_90"は常に同じです: 2 番目の部分の最初の数字に基づくアクション。たとえば、(90 から 99) の場合はアクション 1 を実行し、(80 から 89) の場合はアクション 2 を実行し、(70 から 79) の場合はアクションを実行します。アクション 3。"PLAYER:RON_"PLAYER:RON_90PLAYER:RON_87PLAYER:RON_75PLAYER:RON_second partPLAYER:RON_second partPLAYER:RON_second part

それを達成する方法は?正規表現を変更しますか? またはいくつかの他の方法?誰でも助けることができますか?

4

2 に答える 2

8

どうですか:

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

\d+ という表記は、「少なくとも 1 桁の 10 進数」を意味します。

アップデート:

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 は の直後の番号になりRON_playerGroupは探しているものになります。

于 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 に答える