0

我必须在 TCL 中使用正则表达式来解析这种格式。这是格式

              wl -i eth1 country

              Q1 (Q1/27) Q1

我正在尝试使用单词 country 作为关键字来解析格式“Q1 (Q1/27) Q1”。如果它与国家/地区在同一行,我可以使用以下正则表达式命令。

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

但是我该如何解决上述情况?

4

1 回答 1

2

首先,您使用的正则表达式首先并没有做正确的事情,因为[^country]匹配一字符,该字符集由除 in 之外的所有字母组成country(因此它仅从hineth1开始匹配,因为需要country然后)。

默认情况下,Tcl 使用整个字符串来匹配,换行符只是普通字符。(还有一个选项可以通过指定 来使它们变得特别-line,但默认情况下它不是打开的。)这意味着如果我使用你的整个字符串并regexp用你的正则表达式输入它,它就可以工作(好吧,你可能想要string trim $country_value在某些观点)。这意味着您真正的问题在于提供要匹配的正确字符串。

如果您一次显示一行(可能是从文件中读取),并且您想对一行使用匹配来触发下一行的处理,则需要在正则表达式匹配之外进行一些处理:

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 {$line eq ""} continue请在if {$found_country} ....

于 2012-08-10T08:19:43.250 回答