2012-07-17 113 views
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是已知的,在其它程序上的前捕獲。

如果我在for循環中輸入pattern_$nb_table,我得到了所有表的名字,這很好,但是我從來沒有打印出I found one!(當然,我想成爲另一個進程,但它不是主題)。爲什麼我從來沒有去過if?我的文件包含以下模式:pattern_1 pattern_2 .....

回答

1

問題是變量未被替換爲正則表達式({ ... }禁用所有立即替換)。這是一個情況下,你會使用(把變量名中括號只是爲了清楚起見,並把在雙引號模式爲突出):

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

除此之外,如果我一直在尋找一個字符串就這麼簡單,我會嘗試使用string firststring match

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

這兩者都是比正則表達式匹配速度更快,只要你」重新做一些簡單的事。如果其餘的realpattern是一個正則表達式,那麼只有regexp會這樣做。當然。

+0

完美地工作!謝謝 – heyhey 2012-07-17 11:58:26