Используйте Regex для извлечения строки текста, исключая строки с определенными фразами - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть проблема, с которой я боролся последние пару часов.Я не мог понять это даже после того, как посмотрел похожие посты по 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 Постоянная ссылка .

Это регулярное выражение соответствует всей строке, за исключением числа в начале, такого как "1)" или "2)".Теперь мне просто нужно регулярное выражение, чтобы сделать отрицательный взгляд вперед и исключить строки 1 и 2, так как в них есть «ПЕРЕДАЧА, ЧТОБЫ УДЕРЖИВАТЬ» и «ЧЕРТЕЖ АЛЬТЕРНАТИВНОЙ ЛАБОРАТОРИИ».

Ваша помощь будет принята с благодарностью!

Спасибо,

Марк С.

Ответы [ 3 ]

0 голосов
/ 08 декабря 2018

Вы можете использовать отрицательный прогноз, чтобы утверждать, что строка не заканчивается на 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

Примечание: Если значение может быть TRANS или TRANSFER, вы можете использовать TRANS(?:FER)? с необязательной деталью, соответствующей FER.

Если текст не должен быть в строке, вы можете проверить это demo vb.net .Если текст не должен находиться в конце строки, вы можете проверить это demo

Если вам нужно только 5 совпадений, вы можете сопоставить 1+ цифр и закрывающую скобку \d+\)в начале:

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

Regex demo

Edit:

Если у вас есть 1 строка, вы можете использоватьподход с закаленной точкой с положительным взглядом:

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

0 голосов
/ 08 декабря 2018

Обновление!@ Четвертая Птица дала правильный ответ.Правильный ответ ...

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

Вы можете увидеть его в онлайн-редакторе регулярных выражений здесь` Пример редактора онлайн-регулярных выражений

А затем завершить этот постЯ вставляю код VB.NET, который идет вместе с ним.Скопируйте и вставьте код прямо в Visual Studio, чтобы попробовать сами.

Отдельное спасибо @The Fourth 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

Конечный модуль

0 голосов
/ 08 декабря 2018

Вы правы - вам нужно использовать негативный взгляд:

^((?!TRANSFER TO HOLD ORDER|ALTERNATE LAB DRAW).)*$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...