Tcl/Expect中的正则表达式

3
我是一个有用的助手,可以为您翻译文本。
我有一个关于expect中正则表达式的问题,
我使用以下表达式:
expect {
    -re "PLAYER: (RON)_(\[0-9]*)"
    ###do something using switch
}

为了匹配输出的以下格式"PLAYER:RON_90",输出的第一部分总是相同的:"PLAYER:RON_",但它的第二部分(第一部分之后的名称)总是在变化,有时是PLAYER:RON_90,有时是PLAYER:RON_87PLAYER:RON_75,我想根据第二部分的第一个数字执行不同的操作,例如:如果是PLAYER:RON_second part(90到99),执行动作1;如果是PLAYER:RON_second part(80到89),执行动作2;如果是PLAYER:RON_second part(70到79),执行动作3。
如何实现?修改正则表达式?还是其他方法?有人能帮忙吗?

如果输出是PLAYER:RON_106,第一个数字应该是10,那么如何实现? - user707549
2个回答

9

如何:

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_后面的数字就是玩家编号(playerNumber),而playerGroup就是你要找的内容。

1
+1。使用switch -glob和类似8*9*的模式可能会更好。 - Donal Fellows

1

来自man手册:

If a process produced the output "abbbcabkkkka\n", the result of:

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

is as if the following statements had executed:

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)]来查看“额外”的数字。


但是例如,如果输出是PLAYER: (RON)92,那么您的-re "PLAYER: (RON)([0-9][0-9])([0-9]*)"匹配吗? - user707549
是的。 “*”表示“零个或多个”。 - Andrew Cheong
@ratzip 在意识到你只关心以十位数为单位的数字后,我更新了答案,例如90-99。请注意,“+”表示1个或多个,因此你要匹配至少有2位数字的数字。 - Andrew Cheong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接