【问题标题】:Regex matching lines not containing word EMPTY不包含单词 EMPTY 的正则表达式匹配行
【发布时间】:2015-07-06 07:34:20
【问题描述】:

我有一组要从中提取的数据。目前,我只想提取类似于我使用正则表达式的2 879-858-35 0x0109037 A 0 # 0131-0 23 24 PLFD CC 的行

(\d+)\s+(\S+)\s+(\w+)\s+\w+\s+\d*\s+\#\s+\S+\s+\d+\s+\d+\s+(.+)(?!EMPTY)

但是,我不想得到包含EMPTY 的行。我已经在regex101 尝试了正则表达式,但它似乎仍然与包含字符串EMPTY 的行匹配。

另外,有没有办法缩短正则表达式?我尝试过(\d+)\s+(\S+)\s+(\w+)\d+(.+)(?!EMPTY),但它一直捕获A(在标题下,标题Rev)一直到行尾。我的一些其他试验和错误最后也捕获了一些空白,我使用了一次(?!),所以我不确定我是否可以使用它两次,对此有什么帮助吗?

CATALYST_TH 1
BACKPLANE A
#Slot Type        Serial #   Rev  Num    Date   XptA XptB Name
  2   879-858-35  0x0109037   A   0    # 0131-0 23   24   PLFD   CC
  6   879-857-01  0x0253bb0   A   0    # 9517-0 15   16   PMM  CC-01
  7   000-000-00  0x0000000  P0   0    # 0000-0 13   14   EMPTY    
  8   000-000-00  0x0000000  P0   0    # 0000-0 11   12   EMPTY    
  9   000-000-00  0x0000000  P0   0    # 0000-0 9    10   EMPTY    
 10   000-000-00  0x0000000  P0   0    # 0000-0 7    8    EMPTY    
 20   000-000-00  0x0000000  P0   0    # 0000-0 37   38   EMPTY    
 21   000-000-00  0x0000000  P0   0    # 0000-0 39   40   EMPTY    
 22   000-000-00  0x0000000  P0   0    # 0000-0 41   42   EMPTY    
 23   000-000-00  0x01a2446  P0   0    # 0000-0 43   44   EMPTY    
  1   949-669-00  0x026a850   B   0    # 0809-0 3    0    HAS (Left HAS LA669-00)
 13   949-668-00  0x200762d   A   0    # 9530-0 0    0    CATALYST HAC
 12   949-667-00  0x026a4ee   D   0    # 0102-0 0    0    DIF
 24   949-669-01  0x2006037   B   0    # 9717-0 4    0    HAS (Right HAS LA669-01)
END

【问题讨论】:

    标签: regex pcre


    【解决方案1】:

    .+.* 放在否定前瞻之后。此外,在负前瞻之前添加的工作边界也是非常需要的。

    (\d+)\s+(\S+)\s+(\w+)\s+\w+\s+\d*\s+\#\s+\S+\s+\d+\s+\d+\b(?!\h+EMPTY\b)\s*(.*)
    

    DEMO

    【讨论】:

    • 嗯,这确实排除了包含 EMPTY 的行,但它不会捕获其他行,例如末尾有 HAS (Left HAS LA669-00) 的行。
    • 在哪里?请参阅我附加的链接。
    • 是的,我的意思是你的链接/演示中的那个,忘记把它放在我的评论中。
    • 匹配HAS (Left HAS LA669-00)的行
    【解决方案2】:

    您可以使用多行模式和以下更新的正则表达式:

    /(\d+)\s+(\S+)\s+(\w+)\s+\w+\s+\d*\s+\#\s+\S+\s+(?:\d+\s+){2}((?!.*EMPTY\b).+)$/m
    

    demo

    ((?!.*EMPTY\b).+) 中的负前瞻 (?!.*EMPTY\b) 检查前一个子模式之后的子字符串是否不以 EMPTY 结尾。

    很难缩短您的正则表达式,因为只有 1 个重复模式 \d+\s+ 我们可以缩短为 (?:\d+\s+){2}

    【讨论】:

    • 也尝试了您的答案并且它正在工作。谢谢:)
    【解决方案3】:

    在开始时使用负前瞻:

    ^(?!.*EMPTY\s*$)\s+(\d+)\s+(\S+)\s+(\w+)\s+\w+\s+\d*\s+\#\s+\S+\s+\d+\s+\d+\s+(.+)
    

    我使用了你的正则表达式并添加了^(?!.*EMPTY\s*$)\s+。原因是负前瞻必须锚定到某个东西上,否则它的一部分将被.+ 吃掉并且它会被忽略,即使你最后有EMPTY。这里我将它锚定到字符串的开头。

    【讨论】:

      猜你喜欢
      • 2017-02-06
      • 2022-12-11
      • 2016-01-14
      • 1970-01-01
      相关资源
      最近更新 更多