正则表达式,tcl

时间:2013-04-19 16:38:49

标签: regex tcl

我正在尝试从跟踪文件中提取特定行,如下所示:

- 0.118224 0 7 ack 40 ------- 1 2.0 7.0 0 2
r 0.118436 1 2 tcp 40 ------- 2 7.1 2.1 0 1
+ 0.118436 1 2 ack 40 ------- 2 3.1 2.1 0 3
- 0.118436 1 2 ack 40 ------- 2 4.1 2.1 0 3
r 0.120256 0 7 ack 40 ------- 1 2.0 7.0 0 2

我想提取具有以下内容的任何行:

r x.xxxxx 1 2 xxx xx ------- x numbers.x 2.x x x

注意:x表示任何值,numbers可以介于3到7之间。

这是我的尝试 - 它不起作用!!:

if {[regexp \r+ ([0-9.]+) 1 2.*-  ([3-7.]+) 2.*- ([0-9.]+) $line -> time]} 

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您必须使用.转义\。它表示正则表达式中的“任何字符”。

所以你的正则表达式看起来像:

if {[regexp {r \d\.\d{5} 1 2 \d{3} \d{2} ------- \d [3-7]\.\d 2\.\d \d \d} $line -> time ]} {
   # ...
}

现在您必须将()放在您想要的部位周围。

顺便说一下:我对你想要匹配的内容的描述使用了以下转换:

set input {r x.xxxxx 1 2 xxx xx ------- x numbers.x 2.x x x}
set re [subst [regsub -all {x{2,}} $data {\\\\d{[string length \0]}}]]
set re [string map {. {\.} x {\d} numbers {[3-7]}} $re]

答案 1 :(得分:0)

这是另一种方法:提取您要用于比较的字段

while {[gets $f line] != -1} {
    lassign [split $line] a - b c - - - - d e - -
    if {
            $a eq "r"  && 
            $b == 1    && 
            $c == 2    && 
            3 <= floor($d) && floor($d) <= 7  && 
            floor($e) == 2
    } {
        puts $line
    }
}