Регулярные выражения: поиск подстроки если после неё нет определённого выражения

У меня есть следующее регулярное выражение: (?:\d+[-, \.]*)+\s*(?:нед|н)?[\. ]*, оно применяется к строке: 3-4 нед. Математический анализ 1 гр

При поиске подстроки находится 2 результата: 3-4 нед. и 1 (часть от "1 гр"). Я бы хотел узнать, как мне искать подстроку таким образом, чтобы оно находило только ту часть, после которой не идёт выражение (подгруппа|подгруп|подгр|п\/г|группа|гр)?

Я пробовал использовать Negative Lookahead:

(?:\d+[-, \.]*)+\s*(?:нед|н)?[\. ]*(?!.*(подгруппа|подгруп|подгр|п\/г|группа|гр))

но при данном выражении у меня при совпадении с 'гр' все другие совпадения тоже становятся ненайденными, а если в нём убрать поиск всех символов в начале (.*), то оно вообще почему-то перестаёт работать.


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

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

Вы можете использовать

\d+(?:[-,\s.]\d+)*\s*н(?:ед)?(?![.\s]*(?:подгруппа|подгруп|подгр|п\/г|группа|гр))[.\s]*

См. пример работы регулярного выражения. Подробности:

  • \d+ - одна или более цифр
  • (?:[-,\s.]\d+)* - ноль и более последовательности -, , .` или пробельного символа, за которым следует одна или более цифр
  • \s* - ноль и более пробельных символов
  • н - буква н
  • (?:ед)? - опциональная подстрока ед
  • (?![.\s]*(?:подгруппа|подгруп|подгр|п/г|группа|гр)) - сразу справа не должно быть ноля и более точек и пробельных символов, после которых идёт подгруппа, подгруп, подгр, п/г, группа и гр
  • [.\s]* - ноль и более пробельных символов и точек.
→ Ссылка