我有一个关于期望中的正则表达式的问题,
我使用以下表达式:
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。
如何实现? 修改正则表达式? 还是其他方式? 谁能帮忙?
怎么样:
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_
之后的数字,而玩家组将是您要查找的号码。
从手册页:
如果一个进程产生输出"abbbcabkkkka",则结果为:
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)]
来查看"额外"数字。