下面的代码有什么问题
if {[regexp "pattern" $line]} {
set match [lindex $line 1]
} else {
set match 0 }
我试图在一个重复多次的大文件中搜索一个模式(以及其他模式),一旦模式匹配我存储到一个变量'匹配'否则我需要打印相同的变量为0,问题是一次模式匹配只有一个值连续打印
对于前:
line1 in
第2行5
模式10
我输出为0,如果else语句不存在输出为0,我尝试使用lsearch但输出是相同的
更新问题: 文件包含以下内容 - :
第1行:在这里开始cmd 第2行:这里的开始列表 第3行:结束列表 。 。 。 几行 。 。 。 Line1:这里是常规cmd 第2行:这里的常规列表 模式: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
你看看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
}
代码没有明显的错误
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
在此代码中,一旦找到匹配项,就不再从文件中读取任何行。如果想要从多行中找到匹配项,则可以将每个匹配项添加到列表中。
此外,如果“pattern”包含正则表达式元字符,regexp pattern pattern
将失败,就像在
% set pattern abc
abc
% regexp $pattern $pattern
1
% set pattern ab*c
ab*c
% regexp $pattern $pattern
0