下面的代码有什么问题
if {[regexp "pattern" $line]} {
set match [lindex $line 1]
} else {
set match 0 }
我试图在重复多次的大文件中搜索模式(以及其他模式),一旦模式匹配,我将其存储到变量“ match”中,否则我需要打印与0相同的变量,问题是一旦图案匹配,就只有一个值连续打印
例如:
line1 v
第2行5
模式10
我将输出设为0,如果else语句不存在,则输出为0,我也尝试使用lsearch,但输出相同
更新问题:
文件具有以下内容-:
第1行:在此处开始cmd
Line2:开始列表在这里
第3行:此处的结束列表
。
。
。
几行
。
。
。
Line1:常规cmd在这里
Line2:此处为常规列表
图案:10
第3行:此处结束文件
set x {}
set y {}
set z {}
set f1 [open file r]
while {![eof $f1} {
gets $f1 f
if {[regexp "Line1:" $f]} {
set x [lindex $f 1]
}
if {[regexp "Line3:" $f]} {
set y [lindex $f 2]
}
if {[regexp "pattern:" $f]} {
set z [lindex $f 1]
} else {
set z 0
}
puts "$x $y $z"
}
close $f1
输出应为:
开始清单0
常规文件10
答案 0 :(得分:0)
您是否签出了regexp
选项-all
,甚至可能是-inline
?
set matches [regexp -all -inline $yourRegEx $line]
如Donal所指出的,您需要将regexp -all -inline
的输出视为一个列表:
set matches [regexp -all -inline $yourRegEx $line]
if {![llength $matches]} {
set matches 0
}
答案 1 :(得分:0)
代码显然没有错
if {[regexp "pattern" $line]} {
set match [lindex $line 1]
} else {
set match 0
}
,如果line
的内容为{pattern 10}
,则确实会将match
设置为10。
但是周围的代码中可能存在问题,例如变量line
没有为每一行更新新值。
要读取和搜索文件中的每一行(此示例为“ myfile.txt”):
set f [open myfile.txt]
while {[gets $f line] >= 0} {
if {[regexp "pattern" $line]} {
set match [lindex $line 1]
} else {
set match 0
}
if {$match != 0} {
break
}
}
close $f
在此代码中,一旦找到匹配项,就不再从文件中读取任何行。如果要从多行中查找匹配项,则可以将每个匹配项添加到列表中。
此外,如果“模式”包含正则表达式元字符,则regexp pattern pattern
将失败,就像在
% set pattern abc
abc
% regexp $pattern $pattern
1
% set pattern ab*c
ab*c
% regexp $pattern $pattern
0