Tcl Regexp将模式匹配保存到变量中
下面的代码有什么问题Tcl Regexp将模式匹配保存到变量中,tcl,Tcl,下面的代码有什么问题 if {[regexp "pattern" $line]} { set match [lindex $line 1] } else { set match 0 } 我试图在一个重复多次的大文件中搜索一个模式(以及其他模式),一旦模式匹配,我将存储到变量“match”中,否则我需要打印与0相同的变量,问题是,一旦模式匹配,只有一个值会连续打印 例如: 线路1 v 第2行5 模式10 我得到的输出为0,如果else语句不存在,则输出
if {[regexp "pattern" $line]} {
set match [lindex $line 1]
} else {
set match 0 }
我试图在一个重复多次的大文件中搜索一个模式(以及其他模式),一旦模式匹配,我将存储到变量“match”中,否则我需要打印与0相同的变量,问题是,一旦模式匹配,只有一个值会连续打印
例如:
线路1 v
第2行5
模式10
我得到的输出为0,如果else语句不存在,则输出为0,我也尝试使用lsearch,但输出是相同的
更新问题:文件包含以下内容-: 第1行:在此处开始cmd
第2行:此处开始列表
第3行:此处的结束列表
.
.
.
几行
.
.
.
第1行:此处的常规命令
第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您是否检查了选项
-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
}
如果行
的内容是{pattern 10}
它确实将匹配
设置为10
但是周围的代码可能存在问题,比如变量line
没有使用每行的新值进行更新
要读取和搜索文件中的每一行(本例中为“myfile.txt”),请执行以下操作:
在这段代码中,一旦找到匹配项,就不会从文件中读取更多的行。如果要从多行中查找匹配项,可以将每个匹配项添加到列表中
此外,如果“pattern”包含regex元字符,regexp-pattern-pattern
将失败,如中所示
% set pattern abc
abc
% regexp $pattern $pattern
1
% set pattern ab*c
ab*c
% regexp $pattern $pattern
0
你先确认你的正则表达式没问题吗?您可以通过@Tharwn,我不知道如何使用此处的链接来检查每次迭代的预期输出(
$x$y$z
)是什么?@mrcalvin Start list 0;常规文件10这没有意义:a)您的示例不是MCVE,因为未定义f
(我只能猜测这是从文件路径文件
获得的行列表);b) 示例数据中没有包含“常规文件10”内容的行。我希望看到一个脚本和测试数据,如果有帮助的话,我可以复制粘贴并在本地运行。我也尝试了,但我得到了以下错误:预期的布尔值,但得到了“”,然后需要检查结果的L长度
,看看是否有匹配的内容。@DonalFellows,没有-all-inline,我正在获得输出,如果模式匹配,我需要将输出打印为10,否则为0。在我的情况下,我要么得到全部10,要么得到全部0s@mrcalvin,它对我不起作用,如果“模式”总是出现在文件中,它会起作用吗?我正在执行一段代码,其中除我所指的模式外,所有其他行都会定期重复,因此,当我获取所有其他行的值时,如果该行组中没有模式,我需要将变量打印为0。如果没有模式,您的输出是否为0?“文件”、“行组”、“模式”。恐怕我迷路了。我建议您更新您的问题,以包括代表性测试数据(行)、实际正则表达式和预期匹配。是的,我的变量“line”不会随着每次搜索而更新,我尝试将其取消设置或设置为空,是否可以在某个点进行更新?使用“break”对我不起作用,但是在打印到另一个文件后将变量设置为0,请在再次打印之前重置变量,谢谢!
% set pattern abc
abc
% regexp $pattern $pattern
1
% set pattern ab*c
ab*c
% regexp $pattern $pattern
0