用于匹配注释和first_line_of_entry的正则表达式

时间:2018-08-10 19:31:44

标签: regex

对于下面的输入(小),有两个条目

评论以#

开头

条目是多行并带有反斜杠(\)的延续

第一个条目的第一行有评论

第二个条目的第一行没有注释。

# 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))+)


如何结合这两个正则表达式来检索这两个标记?

2 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式将您的匹配项分成2个捕获组:

^#\s*(\S+).*\s+([\d.]+)

RegEx Demo

正则表达式详细信息:

  • ^#\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