我想在文件中找到一个模式,但模式可以有多种形式。 这是代码:
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 .....
答案 0 :(得分:1)
问题是变量没有被替换为正则表达式({
... }
禁用所有立即替换)。这是您使用的情况(为了清晰起见,将变量名称放在大括号中,并将模式放在双引号中以突出显示 ):
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
会这样做。当然。