Регулярные выражения: поиск подстроки если после неё нет определённого выражения
У меня есть следующее регулярное выражение:
(?:\d+[-, \.]*)+\s*(?:нед|н)?[\. ]*, оно применяется к строке: 3-4 нед. Математический анализ 1 гр
При поиске подстроки находится 2 результата: 3-4 нед. и 1 (часть от "1 гр"). Я бы хотел узнать, как мне искать подстроку таким образом, чтобы оно находило только ту часть, после которой не идёт выражение (подгруппа|подгруп|подгр|п\/г|группа|гр)?
Я пробовал использовать Negative Lookahead:
(?:\d+[-, \.]*)+\s*(?:нед|н)?[\. ]*(?!.*(подгруппа|подгруп|подгр|п\/г|группа|гр))
но при данном выражении у меня при совпадении с 'гр' все другие совпадения тоже становятся ненайденными, а если в нём убрать поиск всех символов в начале (.*), то оно вообще почему-то перестаёт работать.
Ответы (1 шт):
Вместо .* нужно использовать только такой шаблон, который может встретиться до исключаемых слов.
Вы можете использовать
\d+(?:[-,\s.]\d+)*\s*н(?:ед)?(?![.\s]*(?:подгруппа|подгруп|подгр|п\/г|группа|гр))[.\s]*
См. пример работы регулярного выражения. Подробности:
\d+- одна или более цифр(?:[-,\s.]\d+)*- ноль и более последовательности-,,.` или пробельного символа, за которым следует одна или более цифр\s*- ноль и более пробельных символовн- букван(?:ед)?- опциональная подстрокаед(?![.\s]*(?:подгруппа|подгруп|подгр|п/г|группа|гр))- сразу справа не должно быть ноля и более точек и пробельных символов, после которых идётподгруппа,подгруп,подгр,п/г,группаигр[.\s]*- ноль и более пробельных символов и точек.