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

时间:2018-08-29 06:50:15

标签: tcl

下面的代码有什么问题

    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

2 个答案:

答案 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