
В настоящее время у меня есть регулярное выражение для поиска строк, содержащих «bar», но не предваряемых «foo»:
(?<!foo)bar
Я хочу изменить регулярное выражение для соответствия строкам, содержащим «bar», но не предваряемым «foo» и (необязательно) какими-либо дополнительными символами.
НАПРИМЕР, «footestbar» не должен совпадать, так как bar предшествует «foo», а за ним следует «test».
Я не могу найти способ сделать это, так как регулярные выражения не позволяют использовать квантификатор в отрицательном ретроспективном просмотре. Соответственно, я не могу сделать следующее:
(?<!foo.*)bar
Есть ли альтернативный подход?
ОБНОВЛЯТЬ:
Разновидность регулярного выражения:re2. В настоящее время я просматриваю документацию, но на первый взгляд заметил следующее:
(?<!re) after text not matching re (NOT SUPPORTED)
Поэтому решение не может использовать отрицательный ретроспективный анализ (если я правильно интерпретирую документацию).
решение1
Измененный пост
Так что, похоже, некоторые (большинство?) движков Regex работают только с фиксированной длиной lookbehind. Однако они, похоже, прекрасно принимают переменную длину lookahead. Я не уверен, какой у вас вариант использования этого или насколько это будет жизнеспособно, но одна из идей может заключаться в том, чтобы перевернуть вашу строку и использовать:
rab(?!.*oof)
Конечно, это выглядит смешно, и я не знаю, как вы это используете или насколько это будет полезно. Большая часть моего опыта с Regex была связана с использованием .NET, и в основном мне не нужны были ретроспективные просмотры. Просто идея для вас..!
Оригинальный пост - Работает только с определенными движками Regex (проверено с использованием .NET)
Попробуйте следующее регулярное выражение:
(?<!foo(?:.*)?)bar
Это добавляет необязательную, не захватывающую группу в пределах того же отрицательного взгляда назад.