Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在TCL-regexp中匹配新行_Regex_Tcl - Fatal编程技术网

在TCL-regexp中匹配新行

在TCL-regexp中匹配新行,regex,tcl,Regex,Tcl,我有一个变量 set a "-------------------------------------------------------------------------------- Proto Source Address Pkt-Cnt Start Destination Address Byte-Cnt -----

我有一个变量

set a "--------------------------------------------------------------------------------
       Proto     Source Address                         Pkt-Cnt    Start
                 Destination Address                    Byte-Cnt
       --------------------------------------------------------------------------------

       UDP       150.1.1.2                              25         05/24/2021 07:07:29
                 150.2.1.2                              1150      

      --------------------------------------------------------------------------------"
我需要匹配单词UDP之后的所有值。 我试着用这个来匹配第一行,效果很好。但我无法获得值“150.2.1.2”和“1150”-非常感谢任何帮助

    regexp "UDP + (\[\[:graph:]]+) + (\[\[:graph:]]+) + (\[\[:graph:]]+) +(\[\[:graph:]]+)"  $a match data1 data2 data3 data4

您可以按照类似的逻辑添加另外两个捕获组,并用
\s+
分隔(一个或多个空格):

请注意,
\S+
匹配一个或多个非空白字符,
\S+
匹配一个或多个空白字符

请参阅将UDP声明为变量时的:

set a "--------------------------------------------------------------------------------
       Proto     Source Address                         Pkt-Cnt    Start
                 Destination Address                    Byte-Cnt
       --------------------------------------------------------------------------------

       UDP       150.1.1.2                              25         05/24/2021 07:07:29
                 150.2.1.2                              1150      

      --------------------------------------------------------------------------------"

set b "UDP"
regexp "$b\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)" $a match data1 data2 data3 data4 data5 data6
puts "$data1, $data2, $data3, $data4, $data5, $data6"
# 150.1.1.2, 25, 05/24/2021, 07:07:29, 150.2.1.2, 1150

有几种方法,但我认为这是你应该使用的:

{UDP\s*([\d.]+)\s*(\d+)\s*([\w/]+ [\w:]+)\s*([\d.]+)\s*(\d+)}
它用大括号括起来,否则会有很多额外的反斜杠

关键部分:

  • UDP
    -标记文本
  • \s*
    -空白(空格、制表符等)
  • ([\d.]+)
    -捕获的数字和点(源地址)
  • \s*
    -空白
  • (\d+)
    -捕获的数字(数据包计数)
  • \s*
    -空白
  • ([\w/]+[\w:]+)
    -捕获的开始时间戳(中间只有一个空格)
  • \s*
    -空白(包括换行符;默认情况下,换行符是空白)
  • ([\d.]+)
    -捕获的数字和点(目标地址)
  • \s*
    -空白
  • (\d+)
    -捕获的数字(字节计数)
  • 使用中:

    regexp {UDP\s*([\d.]+)\s*(\d+)\s*([\w/]+ [\w:]+)\s*([\d.]+)\s*(\d+)} $a -> source packetCount start destination byteCount
    

    总是把你的RES在括号里,除非你需要在它们中间的TCL替换。否则,所有额外的反斜杠将给您带来无尽的麻烦。您好,谢谢您的回答,这是可行的,但是如果我用一个变量替换UDP,它将不匹配,如regexp{$b\s+(\s+)\s+(\s+)\s+(\s+)\s+(\s+)}$a match data1 data2 data3 data4 data5data6@GiridharanL从你的问题看不清楚,,我更新为使用
    UDP
    作为变量。我需要像set b一样使用UDP-这也可以吗?@GiridharanL当然可以,请看我的演示,它使用
    set b“UDP”
    @GiridharanL很高兴它能为您工作。另外,如果我的回答对您有帮助(请参阅),因为您在达到15个代表点后有权享有向上投票的特权。请注意,您可以投票选出所有有帮助的答案。您好,谢谢您的答案,但我可以用一个变量代替标记文本,因为“b”中的值为UDP,regexp{$b\s*([\d.]+)\s*(\d+\s*([\w/]+[\w:+)\s*([\d.]+)\s*(\d+}$a->source packetCount start destination bytecount如果您需要一个变量,使用
    format
    命令插入它可能是最简单的方法,这样您就不会受到反斜杠的攻击:
    regexp[format{%s\s*([\d.]+)\s*(\d+)\s*([\w/]+[\w:]+)\s*([\d.]+)\s*(\d+)}$b]$a->sourcepacketcount start destination byteCount(另外,要注意,你放进去的东西本身需要是一个行为良好的RE,它不捕获任何东西,也没有终端锚。
    UDP
    就是一个好例子,而
    foo(bar)$
    在几个方面都是坏的。)
    regexp {UDP\s*([\d.]+)\s*(\d+)\s*([\w/]+ [\w:]+)\s*([\d.]+)\s*(\d+)} $a -> source packetCount start destination byteCount