过去两个小时来,我一直在苦苦挣扎。即使查看了关于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。
答案 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)).*$
编辑:
如果您有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
最终模块