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_table在 for 循环中执行 put,我会得到所有表的名称,这很好,但我从来没有I found one!打印出来(确定我想成为另一个进程,但它不是主题)。为什么我从来不进去if?我的文件包含模式:pattern_1 pattern_2 .....

4

1 回答 1

1

问题是变量没有被替换到正则表达式中({…<code>} 禁用所有立即替换)。这是您将使用的情况(为了清楚起见,将变量名称放在大括号中,并将模式放在双引号中用于突出显示):

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

除了如果我正在寻找一个简单的字符串,我会尝试使用string firstor 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 回答