2012-06-18 3 views
1

У меня есть вопрос о регулярных выражениях ожидать,регулярных выражений в Tcl/планирующие

Я использую следующее выражение:

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.

, как для того чтобы достигнуть его? изменить регулярные выражения? или другими способами? может ли кто-нибудь помочь?

+0

, а также если выход - PLAYER: RON_106, первое число должно быть 10, то как его достичь? –

ответ

6

Как насчет:

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

запись \ д + означает "по меньшей мере, одну десятичную цифру".

UPDATE:

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 будет то, что вы ищете.

+1

+1. Возможно, лучше использовать 'switch -glob' и шаблоны типа' 8 * 'и' 9 * '. –

0

Из страницы руководства:

Если процесс произвел выход "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)].

+0

, но, например, если выход - PLAYER: (RON) _92, ваш -re "PLAYER: (RON) _ (\ [0-9] \ [0-9]) (\ [0-9] *) " Матчи? –

+0

Да. «' * '' Означает «ноль или больше». –

+0

@ratzip Я обновил ответ, поняв, что вы только заботитесь о числах в группах из десятков, например. 90-99. Обратите внимание, что '' '' 'означает 1 или более, поэтому вы сопоставляете число с не менее чем двумя цифрами. –

Смежные вопросы