2

В настоящее время у меня есть регулярное выражение для соответствия, где строка содержит 'bar', но перед ней не стоит 'foo':

(?<!foo)bar

Я хочу изменить регулярное выражение в соответствии с тем, где строка содержит 'bar', но перед ней не стоит 'foo' и (необязательно) любые дополнительные символы.

НАПРИМЕР. «footestbar» не должен совпадать, так как перед «bar» следует «foo», за которым следует «test».

Я не могу найти способ добиться этого, так как регулярные выражения не позволяют использовать квантификатор в негативном взгляде. Впоследствии я не могу сделать следующее:

(?<!foo.*)bar

Есть ли альтернативный подход?

ОБНОВИТЬ:
Аромат регулярного выражения re2. В настоящее время я рассматриваю документацию, но на первый взгляд заметил следующее:

(?<!re)     after text not matching re (NOT SUPPORTED)

Поэтому решение не может использовать отрицательный взгляд назад (если я правильно интерпретирую документацию).

1 ответ1

2

Исправленный пост

Так что казалось бы, что некоторые (большинство?) Движки Regex работают только с фиксированной длиной. Тем не менее, они, кажется, хорошо, чтобы принять прогноз переменной длины. Я не уверен, каков ваш вариант использования для этого или насколько он был бы жизнеспособным, но одна идея могла бы состоять в том, чтобы перевернуть вашу строку и использовать:

rab(?!.*oof)

Конечно, это выглядит нелепо, и я не знаю, как вы его используете или насколько это будет полезно. Большую часть моего опыта работы с Regex я использовал .NET, и в основном не нуждался в сторонних наблюдателях. Просто идея для вас ..!

Original Post - Работает только с некоторыми движками Regex (протестировано с использованием .NET)

Попробуйте следующее регулярное выражение:

(?<!foo(?:.*)?)bar

Это добавляет необязательную группу без захвата в пределах того же негативного взгляда.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .