不包含单词 EMPTY 的正则表达式匹配行

Regex matching lines not containing word EMPTY

我有一组数据要从中提取。目前,我只想在使用正则表达式

的地方提取类似于 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 (在 header 下 header 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

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

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

DEMO

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

/(\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}

开始时使用负前瞻:

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

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