Regex 正则表达式

Regex 正则表达式,regex,tcl,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 我要提取具有以下

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

- 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
我要提取具有以下内容的任何行:

rx.xxxxx12xxx------x个数字.x2.x2xx

注:
x
表示任何值,
数字可以介于3到7之间

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

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

有什么建议吗???

你必须用
\
避开
。它在regexp中表示“任意字符”

因此,您的regexp可能看起来像:

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]

还有另一种方法:提取要用于比较的字段

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
    }
}
而{[get$f line]!=-1}{
lassign[split$line]a-b c--d e--
如果{
$a均衡器“r”和
$b==1&&
$c==2&&

3始终将
if
条件括在大括号中:
if{[regexp…]}{…}
并将regexp也括在大括号中:
if{[regexp{\r…}$line->time]}{…}
将RE括在大括号中通常是个好主意;将条件放在大括号中确实是个好主意(除非它是像
0
true
这样的文字,在这种情况下,它不会产生任何影响),因为它有助于确保
if
本身编译字节码。你的意思是
rx.xxxxxx 1 2xxx------x number.x2.x x x x
?(我添加了另一个
x
,使这一长串数字由原来的5个字符变为6个字符)当d=3,4,5,6时,它不会打印其他值。当d=7时,它只打印第一个值。!!!@SimpleEasy你是在你的示例上尝试这一点吗?记住,由于其他限制,只有第二行应该匹配。我也尝试过,它很有效。我会选择
^r\s.\s{5}12\s{3}\s{2}----\s[3-7]\.\S 2\.\S\S$
我自己(也可能使用
-line
选项),但这只是一个微小的变化。