对于下面的输入(小),有两个条目
评论以#
条目是多行并带有反斜杠(\
)的延续
第一个条目的第一行有评论
第二个条目的第一行没有注释。
# Arista
# aristaBgp4V2EstablishedNotification aristaBgp4V2PeerState
1.3.6.1.4.1.30064.4.1.0.1 0x3330000 1.3.6.1.4.1.30064.4.1.1.2.1.13(1,2)\
# aristaBgp4V2PeerLocalPort
1.3.6.1.4.1.30064.4.1.1.2.1.6(3,0)\
# aristaBgp4V2PeerRemotePort
1.3.6.1.4.1.30064.4.1.1.2.1.9(4,0)
1.3.6.1.4.1.60029.3.8.1.0.1 0x31210004 1.3.6.1.4.1.60029.3.8.0.0.3.1.3(1,2)\
# aristaLastSwOverReason
1.3.6.1.4.1.60029.3.8.0.0.4(3,0)
regex应该检索('aristaBgp4V2EstablishedNotification', '1.3.6.1.4.1.30064.4.1.0.1')
,其中'aristaBgp4V2EstablishedNotification'
作为注释的一部分,这是
第一次输入的第一行(多行)中的虚线符号'1.3.6.1.4.1.30064.4.1.0.1'
的名称
regex不应从第二个条目中获取点分符号1.3.6.1.4.1.60029.3.8.1.0.1
,因为该条目没有附加相应的注释。
对于以下输入(更大):
# Arista
# aristaBgp4V2EstablishedNotification aristaBgp4V2PeerState
1.3.6.1.4.1.30064.4.1.0.1 0x55510000 1.3.6.1.4.1.30064.4.1.1.2.1.13(1,2)\
# aristaBgp4V2PeerLocalPort
1.3.6.1.4.1.30064.4.1.1.2.1.6(3,0)\
# aristaBgp4V2PeerRemotePort
1.3.6.1.4.1.30064.4.1.1.2.1.9(4,0)
# aristaBgp4V2BackwardTransitionNotificationaristaBgp4V2PeerState
1.3.6.1.4.1.30064.4.1.0.2 0x06710001 1.3.6.1.4.1.30064.4.1.1.2.1.13(1,2)\
# aristaBgp4V2PeerLocalPort
1.3.6.1.4.1.30064.4.1.1.2.1.6(3,0)\
# aristaBgp4V2PeerRemotePort
1.3.6.1.4.1.30064.4.1.1.2.1.9(4,0)\
# aristaBgp4V2PeerLastErrorCodeReceived
1.3.6.1.4.1.30064.4.1.1.3.1.1(5,0)\
# aristaBgp4V2PeerLastErrorSubCodeReceived
1.3.6.1.4.1.30064.4.1.1.3.1.2(6,0)\
# aristaBgp4V2PeerLastErrorReceivedText
1.3.6.1.4.1.30064.4.1.1.3.1.4(7,0)
#portTestResultNotification
1.3.6.1.4.1.4996.1.1.10.1.0.14 0x212a000d 1.3.6.1.4.1.4996.1.1.10.1.1.2(1,0)\
1.3.6.1.4.1.4996.1.1.10.1.1.3(2,0)\
1.3.6.1.4.1.4996.1.1.10.1.2.1(3,0)\
1.3.6.1.4.1.4996.1.1.10.1.1.98(4,0)\
1.3.6.1.4.1.4996.1.1.10.1.1.99(5,0)\
1.3.6.1.4.1.4996.1.1.10.1.5.4.1.5(6,7)\
1.3.6.1.4.1.4996.1.1.10.1.5.4.1.12(8,0)\
1.3.6.1.4.1.4996.1.1.10.1.5.4.1.13(9,0)\
1.3.6.1.4.1.4996.1.1.10.1.5.4.1.14(10,0)
# BigIp
#diskVolumeUsageNotification
1.3.6.1.4.1.4997.1.1.10.1.0.17 0x212a000e 1.3.6.1.4.1.4997.1.1.10.1.1.2(1,0)\
1.3.6.1.4.1.4997.1.1.10.1.1.3(2,0)\
1.3.6.1.4.1.4997.1.1.10.1.2.1(3,0)\
1.3.6.1.4.1.4997.1.1.10.1.1.98(4,0)\
1.3.6.1.4.1.4997.1.1.10.1.1.100(5,0)\
1.3.6.1.4.1.4997.1.1.10.1.1.101(6,0)\
1.3.6.1.4.1.4997.1.1.10.1.4.4.1.7(7,8)\
1.3.6.1.4.1.4997.1.1.10.1.4.4.1.5(9,0)
1.3.6.1.4.1.30064.3.8.1.0.1 0x22210004 1.3.6.1.4.1.30064.3.8.0.0.3.1.3(1,2)\
# aristaRedundancyLastSwOverReason
1.3.6.1.4.1.30064.3.8.0.0.4(3,0)
# wlsrStaImpersonation wlsrNodeMac
1.3.6.1.4.1.13323.2.3.1.1.100.6.1002 0x3337000f 1.3.6.1.4.1.13323.2.3.1.1.100.100.5(1,0)\
# wlsrLocation
1.3.6.1.4.1.13323.2.3.1.1.1.1.1.20(2,3)
正则表达式应检索:
('aristaBgp4V2EstablishedNotification', '1.3.6.1.4.1.30064.4.1.0.1')
('aristaBgp4V2BackwardTransitionNotificationaristaBgp4V2PeerState', '1.3.6.1.4.1.30064.4.1.0.2 ')
('portTestResultNotification', '1.3.6.1.4.1.4996.1.1.10.1.0.14')
('diskVolumeUsageNotification', '1.3.6.1.4.1.4997.1.1.10.1.0.17')
('wlsrStaImpersonation','1.3.6.1.4.1.13323.2.3.1.1.100.6.1002')
提醒一下1.3.6.1.4.1.30064.3.8.1.0.1
不是输出的一部分,因为没有与该条目相对应的注释
要从注释中检索第一个字符串,正则表达式为:#\s*\w+
要在条目的第一行中检索 OID ,正则表达式为(?<!\\\n)^((?:[1-9][0-9]{0,3}|0)(?:\.(?:[1-9][0-9]*|0))+)
如何结合这两个正则表达式来检索这两个标记?
答案 0 :(得分:2)
您可以使用此正则表达式将您的匹配项分成2个捕获组:
^#\s*(\S+).*\s+([\d.]+)
正则表达式详细信息:
^#\s*
:在行首匹配#
,后跟0个或多个空格(\S+)
:在第一个捕获组中匹配1个以上非空格字符.*
:匹配该行的其余部分\s+
:匹配1个以上的空格([\d.]+)
:在第二个捕获组中匹配1个以上的数字或点字符答案 1 :(得分:1)
您可以使用一些垃圾正则表达式,也可以正确使用-
(?m)^\#[^\S\r\n]*(\S+).*\s+^(?!\#)[^\S\r\n]*(\S+)
https://regex101.com/r/C8oHsr/1
项目在第1组和第2组中
可读版本
(?m) # Multi-line mode
^ # BOL
\# [^\S\r\n]* # Comment and optional horizontal whitespace
( \S+ ) # (1), Non-whitespace
.* # The rest of line
\s+ # Required Whitespace (line break)
^ # BOL
(?! \# ) # Not a comment line
[^\S\r\n]* # Optional horizontal whitespace
( \S+ ) # (2), Non-whitespace
请注意,如果使用PCRE样式引擎,则可以将此[^\S\r\n]
更改为\h
。