使用正则表达式提取文本行,排除具有某些短语的行

时间:2018-12-07 22:21:10

标签: regex vb.net regex-lookarounds

过去两个小时来,我一直在苦苦挣扎。即使查看了关于stackoverflow的类似文章并进行了研究,我也无法弄清楚,所以我只打算在这里发布它,我敢肯定有人可以在两秒钟之内找出答案...

以下是示例文本:

 1) IF045196B LOREM-IPSEM,DOLOR1          G35311          12/07/2018  09/07/1985   FNL  91452SB=;*      TRANS TO HOLD ORDER
 2) IF045197B LOREM-IPSEM,DOLOR1          G35311          12/07/2018  09/07/1985   FNL  91377SB=;*      ALTERNATE LAB DRAW
 3) IF044770B LOREM-IPSEM,DOLOR1          G35311          09/26/2018  09/07/1985        3020SBX=;R      RANDOM TEXT
  RANDOM TEXT;*    LOREM IPSEM
 4) IF044445B LOREM-IPSEM,DOLOR16         G35311          07/18/2018  09/07/1985        3020SBX=;R      RANDOM TEXT
  RANDOM TEXT;*    LOREM IPSEM
 5) IF044446B LOREM-IPSEM,DOLOR17         G35311          07/18/2018  09/07/1985        10165SB=;S/R    MOVIE TITLE
  3020SBX=;R    RANDOM TEXT         RANDOM TEXT;*    LOREM IPSEM
 6) IF044447B LOREM-IPSEM,DOLOR18         G35311          07/18/2018  09/07/1985        10256SB=;S/R    MOVIE TITLE
  3020SBX=;R    RANDOM TEXT         RANDOM TEXT;*    LOREM IPSEM
 7) IF044449B LOREM-IPSEM,DOLOR19         G35311          07/18/2018  09/07/1985        10256SB=;S/R    MOVIE TITLE
  3020SBX=;R    RANDOM TEXT         RANDOM TEXT;*    LOREM IPSEM

第1行和第2行不匹配,因为它们说“转移至保留订单”和“备用实验室抽签”。

我需要一个正则表达式,它将第3、4、5、6和7行返回给我。我需要整行,然后稍后在程序中处理这些字符串。

为了清楚起见,我应该收到5场比赛。

3) IF044770B LOREM-IPSEM,DOLOR1          G35311          09/26/2018  09/07/1985        3020SBX=;R      RANDOM TEXTRANDOM TEXT;*    LOREM IPSEM
4) IF044445B LOREM-IPSEM,DOLOR16         G35311          07/18/2018  09/07/1985        3020SBX=;R      RANDOM TEXTRANDOM TEXT;*    LOREM IPSEM
5) IF044446B LOREM-IPSEM,DOLOR17         G35311          07/18/2018  09/07/1985        10165SB=;S/R    MOVIE TITLE 3020SBX=;R    RANDOM TEXT         RANDOM TEXT;*    LOREM IPSEM
6) IF044447B LOREM-IPSEM,DOLOR18         G35311          07/18/2018  09/07/1985        10256SB=;S/R    MOVIE TITLE 3020SBX=;R    RANDOM TEXT         RANDOM TEXT;*    LOREM IPSEM
7) IF044449B LOREM-IPSEM,DOLOR19         G35311          07/18/2018  09/07/1985        10256SB=;S/R    MOVIE TITLE 3020SBX=;R    RANDOM TEXT         RANDOM TEXT;*    LOREM IPSEM

我认为答案与下面的正则表达式结合在一起会带来某种负面的前瞻性。

(?<=\s+\d+\)\s+).*

如果要测试,这里是固定链接。 Regex Permalink

此正则表达式匹配整个行,但不包括开头的数字,例如“ 1)”或“ 2)”。现在,我只需要正则表达式对行进行否定的预测,并排除第1行和第2行,因为它们中包含“转移至保留订单”和“替代实验室抽签”。

您的帮助将不胜感激!

谢谢

马克S。

3 个答案:

答案 0 :(得分:2)

您可以使用否定的前瞻来断言该字符串不是以TRANS TO HOLD ORDER或ALTERNATE LAB DRAW结尾。

^(?!.*(?:TRANS TO HOLD ORDER|ALTERNATE LAB DRAW)).*$

说明

  • ^断言字符串的开头
  • (?!否定反查将检查wat在右侧
    • .*匹配任意字符0次以上
    • (?:TRANS TO HOLD ORDER|ALTERNATE LAB DRAW)交替将与两个选项之一匹配并断言字符串的结尾
  • )结束否定前瞻。
  • .*$匹配0+个字符并断言字符串的结尾

请参见Regex demo

注意: 如果该值可以是TRANS或TRANSFER,则可以将TRANS(?:FER)?与可选部分一起使用以匹配FER。

如果文本不应该在字符串中,则可以测试此demo vb.net。如果文本不应位于字符串的末尾,则可以测试此demo

如果只需要5个匹配项,则可以在开头匹配1个以上的数字和右括号\d+\)

^\d+\)(?!.*(?:TRANS TO HOLD ORDER|ALTERNATE LAB DRAW)).*$

Regex demo

编辑:

如果您有1个字符串,则可以使用正点前瞻的钢化点方法:

\d+\)(?:(?!TRANS TO HOLD ORDER|ALTERNATE LAB DRAW).)*?(?=\d+\) |$) demo

答案 1 :(得分:0)

您是对的-您需要使用否定前瞻:

^((?!TRANSFER TO HOLD ORDER|ALTERNATE LAB DRAW).)*$

答案 2 :(得分:0)

更新! @第四只鸟提供了正确的答案。正确的答案是...

\d+\)(?:(?!TRANS TO HOLD ORDER|ALTERNATE LAB DRAW).)*?(?=\d+\) |$)

您可以在此处的在线正则表达式编辑器中查看`  Online Regex Editor Example

然后,为了完成本篇文章,我将粘贴随附的VB.NET代码。将代码直接复制并粘贴到Visual Studio中,以自己动手尝试。

特别感谢@The Third Bird。杰出的工作,谢谢!

如果对您有帮助,请对该帖子评分。

Imports System
Imports System.Text.RegularExpressions

Module Program
Sub Main(args As String())

    Dim RegexStringPattern As String = "(?<=\s+\d+\)\s+).*"
    Dim StringToSearch As String = " 1) IF045196B LOREM-IPSEM,DOLOR1          G35311          12/07/2018  09/07/1985   FNL  91452SB=;*      TRANS TO HOLD ORDER
                                    2) IF045197B LOREM-IPSEM,DOLOR1          G35311          12/07/2018  09/07/1985   FNL  91377SB=;*      ALTERNATE LAB DRAW
                                    3) IF044770B LOREM-IPSEM,DOLOR1          G35311          09/26/2018  09/07/1985        3020SBX=;R      RANDOM TEXT
                                    RANDOM TEXT;*    LOREM IPSEM
                                    4) IF044445B LOREM-IPSEM,DOLOR16         G35311          07/18/2018  09/07/1985        3020SBX=;R      RANDOM TEXT
                                    RANDOM TEXT;*    LOREM IPSEM
                                    5) IF044446B LOREM-IPSEM,DOLOR17         G35311          07/18/2018  09/07/1985        10165SB=;S/R    MOVIE TITLE
                                    3020SBX=;R    RANDOM TEXT         RANDOM TEXT;*    LOREM IPSEM
                                    6) IF044447B LOREM-IPSEM,DOLOR18         G35311          07/18/2018  09/07/1985        10256SB=;S/R    MOVIE TITLE
                                    3020SBX=;R    RANDOM TEXT         RANDOM TEXT;*    LOREM IPSEM
                                    7) IF044449B LOREM-IPSEM,DOLOR19         G35311          07/18/2018  09/07/1985        10256SB=;S/R    MOVIE TITLE
                                    3020SBX=;R    RANDOM TEXT         RANDOM TEXT;*    LOREM IPSEM"

    Dim matches As MatchCollection = Regex.Matches(StringToSearch, RegexStringPattern)
    Dim listOfStrings As List(Of String) = New List(Of String)
    Dim listOfCorrectStrings As List(Of String) = New List(Of String)

    For Each match As Match In matches
        For Each capture As Capture In match.Captures
            Console.WriteLine(capture.Value)
            listOfStrings.Add(capture.Value)
        Next
    Next

    Console.ReadLine()

End Sub

最终模块