2012-08-10 35 views
0

我必須在TCL中使用regexp解析這種格式。 這裏是TCL中的正則表達式

   wl -i eth1 country 

       Q1 (Q1/27) Q1 

我試圖用這個詞作爲國家的一個關鍵詞解析格式「Q1(Q1/27)Q1」的格式。 我可以做到這一點,如果它與國家在同一行使用以下regexp命令。

regexp {([^country]*)country(.*)} $line match test country_value 

但我該如何解決上述情況?

回答

2

首先,您使用正則表達式是不是做得正確的事情擺在首位,因爲[^country]匹配設置在country包括除信件的一切字符(所以從h匹配僅在eth1之後,因爲之後需要有country)。

默認情況下,Tcl使用整個字符串進行匹配,換行符只是普通字符。 (也可以通過指定-line來使它們變得特殊,但默認情況下它是不可用的。)這意味着如果我使用整個字符串並通過regexp用正則表達式提供它,它就可以工作(嗯,您可能想要在某些時候)。這意味着你的真正的問題是在提交正確的字符串來匹配。

如果您一次呈現一行(可能是從文件中讀取),並且您希望針對一行使用匹配來觸發下一行的處理,則需要在正則表達式匹配之外進行一些處理:

set found_country 0 
while {[gets $channel line] >= 0} { 
    if {$found_country} { 
     # Process the data... 
     puts "post-country data is $line" 
     # Reset the flag 
     set found_country 0 
    } elseif {[regexp {(.*) country$} $line -> leading_bits]} { 
     # Process some leading data... 
     puts "pre-country data is $leading_bits" 
     # Set the flag to handle the next line specially 
     set found_country 1 
    } 
} 

如果要完全跳過空白行,請在if {$found_country} ...之前加上if {$line eq ""} continue

+0

最後一點,用'continue'是因爲我無法確定輸入數據中是否有空行。雖然它很容易處理。 – 2012-08-10 08:20:42