Как добавить количественное условие в регулярное выражение, не включая количество в соответствующую группу? - PullRequest
0 голосов
/ 04 февраля 2019

Я хочу создать совпадение только в том случае, если выполняется дополнительное условие количества.

Пример (это нормально):

Регулярное выражение: -(START.*?)_\d+(?=-END)

Ввод:test-START_one_two_three_4-END

Match Group1: START_one_two_three

В любом случае я хочу добавить дополнительную проверку того, что внутри совпадения группы должно быть _{3,4} символов.Но не следуют друг за другом напрямую.

Так что мне придется создать дополнительную группу без захвата с (?:...).То, что я пробовал: 4 раза искать _* до -END:

(?:(?:_[^_]*){4}-END)

Но добавление этого в регулярное выражение больше не создаст совпадения.Почему?

https://regex101.com/r/MHzWBr/2

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

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

Вы также можете превратить положительный взгляд в конце в совпадение.

-(START(?:_[^_]+){2,3})_\d+(?=-END)

Regex demo

Что будет соответствовать:

  • - Соответствие -
  • ( Группа захвата
    • START(?:_[^_]+){2,3} Подберите START и повторите 2-3 раза подчеркивание, а затем не подчеркивание
  • )_\d+ Закрытие группы, совпадение _ и1+ цифр
  • (?=-END) Утверждение того, что справа - -END (или совпадение -END без заглядывания)
0 голосов
/ 04 февраля 2019

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

-(START(?=(?:_[^_]*){3,4}-END).*?)_+\d+(?=-END) 
         ^

См. Демонстрационную версию regex

Теперь (?=(?:_[^_]*){3,4}-END) - это позитивный прогноз, который гарантирует, что сразусправа от текущего местоположения есть

  • (?:_[^_]*){3,4} - три или четыре повторения _ с последующими 0+ символами, отличными от _
  • -END - буквальная -END строка.
  • .*?

Обратите внимание, что если вы хотите сопоставить ближайшее окно между -START и -END вам нужно исключить . и [^_] из совпадения начала шаблонов -START и -END:

-(START(?=(?:_(?:(?!-(?:END|START))[^_])*){3,4}-END)(?:(?!-(?:END|START)).)*)_+\d+(?=-END)

См. это демонстрационное выражение регулярного выражения

Шаблон (?:(?!-(?:END|START)).)* представляет собой жадный жетон .

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