Матч номер между 2 даты - PullRequest
0 голосов
/ 19 марта 2020

Я получил текст, и мне нужно извлечь число, которое находится между 2 датами. Я не могу показать полный текст, поэтому я буду использовать только ту часть, которая мне нужна, но помните, что это часть большего текста.

12/14/2020 355345 12/14/2020

После этого мне нужно получить «355345», в настоящее время у меня нет ничего, чтобы показать, что я делал, потому что я работал над получением текста перед предложением, пока я не понял, что Единственное место, где число находится между 2 датами.

Спасибо!

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Вот фрагмент кода, который может помочь:

Предположим, что ввод:

Imports System.Text.RegularExpressions

'...

Dim input As New StringBuilder

input.AppendLine("12/14/2020 355345 12/14/2020")
input.AppendLine("12/13/2020 425345 12/13/2020")
input.AppendLine("12/20/2020 93488557 12/20/2020")
input.AppendLine("12/21/2020 4 12/21/2020")
input.AppendLine("12/20/2020 3443 12/20/2020")

'...

Используйте RegEx , чтобы извлечь числа между двумя датами следующим образом:

Dim patt = "(\d+\/\d+\/\d+)\s?(\d+)\s?(\d+\/\d+\/\d+)"

For Each m In Regex.
    Matches(input.ToString, patt, RegexOptions.Multiline).
    Cast(Of Match)
    Console.WriteLine(m.Groups(2).Value)
Next

Это захватит три группы. Пример для первого совпадения:

  • m.Groups(1).Value: 14.12.202 первая дата.
  • m.Groups(2).Value: 355345 число между ними.
  • m.Groups(3).Value: 12/14/2020 вторая дата.

Если вы не используете записанные даты, вам не нужно группировать темы и использовать вместо этого следующий шаблон:

Dim patt = "\d+\/\d+\/\d+\s?(\d+)\s?\d+\/\d+\/\d+"

For Each m In Regex.
    Matches(input.ToString, patt, RegexOptions.Multiline).
    Cast(Of Match)
    Console.WriteLine(m.Groups(1).Value)
Next

И вы получите число между двумя датами в группе 1.

Вывод обеих:

355345
425345
93488557
4
3443

regex101

Кроме того, использование квантификаторов в шаблонах RegEx является хорошей идеей, как упомянул г-н @AndrewMorton в своих благодарных комментариях, и пропустить любые возможные вещи, такие как 1234/239994/2293 во входных данных:

Dim patt = "\d{1,2}/\d{1,2}/\d{4}\s(\d{1,})\s\d{1,2}/\d{1,2}/\d{4}"

For Each m In Regex.
    Matches(input.ToString, patt, RegexOptions.Multiline).
    Cast(Of Match)
    Console.WriteLine(m.Groups(1).Value)
Next

Тест квантификаторов здесь .

0 голосов
/ 19 марта 2020

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

\d\d/\d\d/\d\d\d\d +(\d+) +\d\d/\d\d/\d\d\d\d

... где группа захвата 1 будет содержать искомое число. Если вам нужно проверить, что значения на самом деле являются датами, хорошо ... вы можете сделать это с помощью регулярного выражения до некоторой степени, но шаблон становится очень трудным для чтения.

...