0

TCL で正規表現を使用してこの形式を解析する必要があります。ここにフォーマットがあります

              wl -i eth1 country

              Q1 (Q1/27) Q1

国という単語をキーワードとして使用して、「Q1 (Q1/27) Q1」という形式を解析しようとしています。次の正規表現コマンドを使用して、国と同じ行にある場合に実行できます。

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

しかし、どうすれば上記のケースに取り組むことができますか?

4

1 に答える 1

2

まず、使用している正規表現は、そもそも inの文字を除くすべてで構成される文字のセット[^country]に一致するため、まったく正しいことを行っていません (そのため、 in以降のみに一致する必要があるため、その後)。countryheth1country

デフォルトでは、Tcl は文字列全体を照合に使用し、改行は単なる通常の文字です。( も指定して特別なものにするオプションがありますが、-lineデフォルトではオンになっていません。)これは、文字列全体を使用regexpして正規表現でフィードすると機能することを意味します(まあ、おそらくstring trim $country_valueいくつかの点)。これは、実際の問題は、照合する正しい文字列を提示することにあることを意味します。

一度に 1 行ずつ表示し (おそらくファイルから読み取る)、ある行に対する一致を使用して次の処理をトリガーする場合は、正規表現一致以外の処理が必要です。

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前に a を置きif {$found_country} ...ます。

于 2012-08-10T08:19:43.250 に答える