Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用正则表达式提取文本行,不包括带有特定短语的行_Regex_Vb.net_Regex Lookarounds - Fatal编程技术网

Regex 使用正则表达式提取文本行,不包括带有特定短语的行

Regex 使用正则表达式提取文本行,不包括带有特定短语的行,regex,vb.net,regex-lookarounds,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,DO

在过去的几个小时里,我一直在努力解决一个问题。我甚至在看了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+).*

(?你是对的-你需要使用消极的前瞻:

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

你是对的-你需要使用消极的前瞻:

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

您可以使用负前瞻来断言字符串不以TRANS to HOLD ORDER或ALTERNATE LAB DRAW结尾

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

  • ^
    断言字符串的开头
  • (?!
    将检查wat是否在右侧的反向前瞻不应
    • *
      匹配任意字符0+次
    • (?:TRANS TO HOLD ORDER | ALTERNATE LAB DRAW)
      将匹配任一选项并断言字符串结尾的替换
  • 关闭反向前瞻
  • *$
    匹配0+个字符并断言字符串的结尾

注: 如果值可以是TRANS或TRANSFER,则可以使用带有可选部分的
TRANS(?:FER)
来匹配FER

如果文本不应该在字符串中,您可以测试它。如果文本不应该在字符串末尾,您可以测试它

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

^\d+\)(?!.*(:转为保留订单|备用实验室绘图)).$

编辑:

如果您有1个字符串,则可以使用具有正向前瞻性的缓和点方法:

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

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

您可以使用负前瞻断言字符串不以TRANS TO HOLD ORDER或ALTERNATE LAB DRAW结尾

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

  • ^
    断言字符串的开头
  • (?!
    将检查wat是否在右侧的反向前瞻不应
    • *
      匹配任意字符0+次
    • (?:TRANS TO HOLD ORDER | ALTERNATE LAB DRAW)
      将匹配任一选项并断言字符串结尾的替换
  • 关闭反向前瞻
  • *$
    匹配0+个字符并断言字符串的结尾

注: 如果值可以是TRANS或TRANSFER,则可以使用带有可选部分的
TRANS(?:FER)
来匹配FER

如果文本不应该在字符串中,您可以对此进行测试。如果文本不应位于字符串的末尾,则可以对此进行测试

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

^\d+\)(?!.*(:转为保留订单|备用实验室绘图)).$

编辑:

如果您有1个字符串,则可以使用具有正向前瞻性的缓和点方法:

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

\d+\)(?:(?!转换到保留订单|备用实验室绘图)。*?(?=\d+\)\124$)
更新@第四只鸟给出了正确的答案。正确答案是

\d+\)(?:(?!TRANS TO HOLD ORDER|ALTERNATE LAB DRAW).)*?(?=\d+\) |$)
您可以在这里的在线正则表达式编辑器中看到它`

为了完成这篇文章,我粘贴了与之配套的VB.NET代码。将代码复制并粘贴到VisualStudio中,然后自己尝试

特别感谢“第四只鸟”。物候工作,谢谢

如果这篇文章对你有帮助,请给它打分

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
导入系统
导入System.Text.RegularExpressions
模块程序
Sub Main(参数为字符串())

Dim RegexStringPattern As String=“(?Update!@第四只鸟提供了正确的答案。正确的答案是

\d+\)(?:(?!TRANS TO HOLD ORDER|ALTERNATE LAB DRAW).)*?(?=\d+\) |$)
您可以在这里的在线正则表达式编辑器中看到它`

然后,为了完成这篇文章,我将粘贴与之配套的VB.NET代码。将代码复制并粘贴到Visual Studio中,自己尝试一下

特别感谢“第四只鸟”,谢谢你们的辛勤劳动

如果这篇文章对你有帮助,请给它打分

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
导入系统
导入System.Text.RegularExpressions
模块程序
Sub Main(参数为字符串())

Dim RegexStringPattern作为字符串=”(?如果只需要跳过前两行,则根本不需要正则表达式。是否从文件加载此文本?它不总是只有前两行。它可以是任意一行。是否从文件加载?如果只需要跳过前两行,则根本不需要正则表达式。是否从文件加载此文本?它不总是只有前两行s、 它可以是任何一行。你从文件中加载它吗?在我看来,这就是答案。唯一的问题是,它在regex101.com上有效,但在regexstorm.net/tester上不起作用。我将在周一的工作代码中测试它,看看它是否有效。非常感谢你的帮助!你有机会尝试将它插入regexstorm.net/Teste吗r并告诉我为什么它在那个网站上不起作用?@MarkS我已经更新了我的答案,并添加了一个指向regexstorm的链接和一个演示。将这一个标记为答案。\d+((?!TRANS to HOLD ORDER | ALTERNATE LAB DRAW)。*)(?=\d+)|$)是对我有效的方法。继续阅读下面的内容,看看我在VB.NET代码中是如何使用它的。谢谢!上面的注释。\d+(?:(?!TRANS TO HOLD ORDER | ALTERNATE LAB DRAW)。*)*?(?=\d+|$)仅适用于“多行”选项e