Есть ли способ сделать это выражение Regex менее жадным. Использование Excel VBA - PullRequest
1 голос
/ 27 марта 2019

У меня есть документ Excel с ячейкой со следующей информацией:

A) Current to: Notice of 19 June 2014  Sent on: August 2012
B) Updated on: October 2018
C) Updated: 14 January 2009

Я с некоторым успехом использую следующее регулярное выражение:

(\b\d{1,2}\D{0,3})?\b((?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|(?:Nov|Dec)(?:ember)?))\D?(\d{1,2}\D?)?\D?((19[7-9]\d|20\d{2})|\d{2})

вывод у меняследующим образом:

A) 19 June2014August2012
B) October 2018
C) 14 January 2009

B и C извлекают нормально, однако я ожидаю 19 июня 2014 года для A

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

1 Ответ

2 голосов
/ 27 марта 2019

Чтобы соответствовать первому совпадению в строке, вы можете добавить ^.*? в начале шаблона, обернуть то, что у вас есть, в скобки и установить для свойства Multiline regex значение True. Ваш матч внутри match.Submatches(0).

regEx.Pattern = "^.*?((?:\b\d{1,2}\D{0,3})?\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|(?:Nov|Dec)(?:ember)?)\D?(?:\d{1,2}\D?)?\D?(?:(?:19[7-9]\d|20\d{2})|\d{2}))"
regEx.Multiline = True

См. Демоверсию regex .

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