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