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