正则表达式将模式匹配保存到变量中

问题描述 投票:0回答:2

下面的代码有什么问题

    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

tcl
2个回答
0
投票

你看看regexp选项-all,可能还有-inline

set matches [regexp -all -inline $yourRegEx $line]

Update

正如Donal指出的那样,你需要将regexp -all -inline的输出视为列表:

set matches [regexp -all -inline $yourRegEx $line]
if {![llength $matches]} {
    set matches 0
}

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
© www.soinside.com 2019 - 2024. All rights reserved.