匹配 TCL 中的新行 - 正则表达式
Matching new line in TCL - regexp
我有一个变量
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+
(一个或多个空格)分隔的捕获组:
regexp {UDP\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)} $a match data1 data2 data3 data4 data5 data6
请注意,\S+
匹配一个或多个非空白字符,\s+
匹配一个或多个空白字符。
请参阅 online Tcl demo 并将 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
有几种方法可以做到,但我认为这个 RE 是你应该使用的:
{UDP\s*([\d.]+)\s*(\d+)\s*([\w/]+ [\w:]+)\s*([\d.]+)\s*(\d+)}
它用大括号括起来,否则会有 很多 个额外的反斜杠!
必备单品:
UDP
— 标记文本
\s*
— 白色space(space、制表符等)
([\d.]+)
— 捕获的数字和点(源地址)
\s*
— 白色space
(\d+)
— 捕获的数字(数据包计数)
\s*
— 白色space
([\w/]+ [\w:]+)
— 捕获的开始时间戳(中间只有一个 space)
\s*
— 白色space(这包括换行符;换行符默认为白色space)
([\d.]+)
— 捕获的数字和点(目标地址)
\s*
— 白色space
(\d+)
— 捕获的数字(字节数)
正在使用:
regexp {UDP\s*([\d.]+)\s*(\d+)\s*([\w/]+ [\w:]+)\s*([\d.]+)\s*(\d+)} $a -> source packetCount start destination byteCount
我有一个变量
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+
(一个或多个空格)分隔的捕获组:
regexp {UDP\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)} $a match data1 data2 data3 data4 data5 data6
请注意,\S+
匹配一个或多个非空白字符,\s+
匹配一个或多个空白字符。
请参阅 online Tcl demo 并将 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
有几种方法可以做到,但我认为这个 RE 是你应该使用的:
{UDP\s*([\d.]+)\s*(\d+)\s*([\w/]+ [\w:]+)\s*([\d.]+)\s*(\d+)}
它用大括号括起来,否则会有 很多 个额外的反斜杠!
必备单品:
UDP
— 标记文本\s*
— 白色space(space、制表符等)([\d.]+)
— 捕获的数字和点(源地址)\s*
— 白色space(\d+)
— 捕获的数字(数据包计数)\s*
— 白色space([\w/]+ [\w:]+)
— 捕获的开始时间戳(中间只有一个 space)\s*
— 白色space(这包括换行符;换行符默认为白色space)([\d.]+)
— 捕获的数字和点(目标地址)\s*
— 白色space(\d+)
— 捕获的数字(字节数)
正在使用:
regexp {UDP\s*([\d.]+)\s*(\d+)\s*([\w/]+ [\w:]+)\s*([\d.]+)\s*(\d+)} $a -> source packetCount start destination byteCount