Как привести в порядок регулярное выражение для диапазона печати - PullRequest
1 голос
/ 27 июня 2019

Мне нужна помощь, чтобы привести в соответствие регулярное выражение VBA для диапазона печати. ​​

В настоящее время у меня есть это:

(\d+(-\d+)*)+(,\d+(-\d+)*)*

Но для записи 12-25,45,50-53 это возвращает , и - следующим образом:

Матч 1: -25
Матч 2: ,50-53
Матч 3: -53
и не возвращает 45

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

Матч 1: (12-25)
Матч 2: (45)
Матч 3: (50-53)

1 Ответ

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

Причина 45 не в группе в том, что вы повторяете вторую группу захвата.Когда вы повторяете группу захвата, группа содержит значение последней итерации.

Таким образом, (,\d+(-\d+)*) будет захватывать ,45.Теперь вся группа повторяется из-за внешнего * и в этой последней итерации ,50 захватывается ,\d+, а -53 захватывается -\d+

То, что вы можете сделать, это совпадение 1+ цифры и используйте одну необязательную группу для дефиса и 1+ цифры часть, чтобы получить 3 совпадения.

Используйте положительный прогноз (?=,|$), чтобы утверждать, что непосредственно справа находится запятая или конец строки.

\d+(?:-\d+)?(?=,|$)

Regex demo

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

(\d+(?:-\d+)?),(\d+(?:-\d+)?),(\d+(?:-\d+)?)

Regex demo

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