1

ファイル内のパターンを見つけたいのですが、パターンにはいくつかの形式があります。コードは次のとおりです。

while {[gets $thefile line] >= 0} {
     for {set nb_table 1} {$nb_table<$count_table} {incr nb_table} {
          if { [regexp {pattern_$nb_table} $line] } {
          puts "I found one !"
          }
     }
}

var$count_tableは既知であり、他の手順で前にキャッチされます。

pattern_$nb_tableforループに入れて、すべてのテーブルの名前を取得しました。これは良いことですが、印刷I found one!したことはありません(別のプロセスになりたいのですが、件名ではありません)。なぜ私は決して行かないのifですか?私のファイルにはパターンが含まれています:pattern_1 pattern_2 .....

4

1 に答える 1

1

問題は、変数が正規表現に置換されていないことです({…<code>}はすべての即時置換を無効にします)。これは、使用する状況です(わかりやすくするために変数名を中かっこで囲み、強調表示のみを目的としてパターンを二重引用符で囲みます)。

if {[regexp "pattern_${nb_table}" $line]} { ... }

単純な文字列を探している場合を除いて、string firstまたはstring match:を使用してみます。

if {[string first "pattern_${nb_table}" $line] >= 0} { ... }
if {[string match "*pattern_${nb_table}*" $line]} { ... }

単純なことをしている場合、これらは両方とも正規表現のマッチングよりも高速です。実数 の残りがpattern正規表現である場合、のみregexp実行されます。もちろん。

于 2012-07-17T10:12:06.873 に答える