tcl/expect中的正则表达式

tcl/expect中的正则表达式,tcl,expect,Tcl,Expect,我有一个关于expect中正则表达式的问题 我使用以下表达式: expect { -re "PLAYER: (RON)_(\[0-9]*)" ###do something using switch } 为了匹配以下输出格式,输出的第一部分总是相同的:“PLAYER:RON_90”,但第二部分(第一部分后的名称)正在改变,有时是PLAYER:RON_90,有时是PLAYER:RON_87,PLAYER:RON_75,我想根据第二部分的第一个数字做不同的动作,例如:如果是PLAY

我有一个关于expect中正则表达式的问题

我使用以下表达式:

expect {
    -re "PLAYER: (RON)_(\[0-9]*)"
    ###do something using switch
}
为了匹配以下输出格式,输出的第一部分总是相同的:
“PLAYER:RON_90”
,但第二部分(第一部分后的名称)正在改变,有时是
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

如何实现它?修改正则表达式?还是其他方式?有人能帮忙吗?

从手册页:

如果进程产生输出“abbbcabkkka\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\u out(2,string)]
来查看“额外”数字,那么:

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" }
    }
}

如果我们有一个匹配,那么玩家编号将是紧跟在
RON_
之后的数字,玩家组将是您要寻找的。

而且如果输出是PLAYER:RON_106,第一个数字应该是10,那么如何实现它?但是,如果输出是PLAYER:(RON)\u 92,您的-re“PLAYER:(RON)_([0-9][0-9])([0-9]*)“匹配?是的。
*
表示“零或更多”@ratzip我在意识到你只关心以十为一组的数字(例如90-99)后更新了答案。请注意,
+
表示1或更多,因此你将一个数字与至少2位数字进行匹配。+1。最好使用
开关-glob
8*
9*
等模式。