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

时间:2015-07-06 07:34:20

标签: regex pcre

我有一组我想从中提取的数据。目前,我只想提取类似于我使用正则表达式

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

3 个答案:

答案 0 :(得分:1)

.+.*置于否定前瞻后。并且在负面前瞻之前添加的蠕虫边界是非常需要的。

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

DEMO

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

在开头使用否定前瞻:

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

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