VBA Regex - соответствует всей строке, если не повторяется шаблон - PullRequest
4 голосов
/ 04 июня 2019

Я огорчен - и я подозреваю, что есть простое решение для этого, но после значительного количества исследований, я обращаюсь к сообществу.

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

"\s?[a-zA-Z-]*,\s[a-zA-Z]*:\s.*"

Я ожидаю, что метод будет возвращать все после сопоставления имени - до совпадения другого имени.Это был бы желаемый результат.

Строки, к которым я применяю этот шаблон:

Мек, Мэри: Пт. 6/14/2019 17:00 - 22:00КЛЕРКПЕТРО Флинстоун, Фред: пт 6/14/2019 10:00 - 16:00 КЛЕРКПЕТРО Пауэрс, Кенни: пт 14/14/2019 22:00 - 11:00

1011 * Родос,Рэнди: суббота, 15.06.2009 10:15 - 11:30 SERVCNTR, суббота, 15.06.2009 11:30 - 12:45, щелчок и выбор, суббота, 15/15/2019 12:4514:15 SERVCNTR

Когда я применяю шаблон к любой строке, возвращается вся строка.Это не оптимально, потому что я пытаюсь разделить имена, используя match (0), match (1) и т. Д., Поэтому первая строка должна совпадать с:

  1. Meck, Mary: Fri 6/ 14/2019 17:00 - 22:00 CLERKPETRO
  2. Флинстон, Фред: пт. 14/14/2019 10:00 - 16:00 CLERKPETRO
  3. Пауэрс,Кенни: Пт, 14/6/2019 22:00 - 23:00

но вторая строка должна совпадать во всей строке (как в настоящее время), потому что второго имени нетв этой строке.

Как мне решить эту проблему?

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Это один из способов сделать это

\b[a-zA-Z-]+,\s?[a-zA-Z]+:.*?(?=\b[a-zA-Z-]+,\s?[a-zA-Z]+:|$)

https://regex101.com/r/ccj6ea/1

Расширен

 \b 
 [a-zA-Z-]+ 
 , 
 \s? 
 [a-zA-Z]+ 
 : 
 .*? 
 (?=
      \b 
      [a-zA-Z-]+ 
      , 
      \s? 
      [a-zA-Z]+ 
      : 
   |  
      $ 
 )
0 голосов
/ 04 июня 2019

RegEx 1

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

(?:\s+)?([a-zA-Z-]+),?(?:\s+)?([a-zA-Z]+):(.+?[A-Z]{3,}).*

, где наши желаемые результаты находятся в этих трех группах:

([a-zA-Z-]+)
([a-zA-Z]+)
(.+?[A-Z]{3,})

Демо

enter image description here

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

RegEx 2

Если мы хотим разделить их по именам, мы упростим наше выражение до:

(?:\s+)?([A-Z][a-zA-Z-]+),?(?:\s+)?([A-Z][a-zA-Z]+):

Демо 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...