Регулярное выражение - где строка содержит 'bar', но перед ней не стоит 'foo'

3

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

(?<!foo)bar

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

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

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

(?<!foo.*)bar

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

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

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

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

Фицрой
источник
«и (необязательно) любой дополнительный символ (ы)» - что может предшествовать ему? Должно ли это быть в начале строки или в начале слова? Также, пожалуйста, укажите, какой тип регулярного выражения вы используете, это может повлиять на ответ.
Máté Juhász
Я только что получил подтверждение, что это библиотека регулярных выражений re2: github.com/google/re2/wiki/Syntax Я только что прочитал, что после несоответствия текста не поддерживается: (?<!re) after text not matching re (NOT SUPPORTED)
Фицрой

Ответы:

2

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

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

rab(?!.*oof)

введите описание изображения здесь

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

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

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

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

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

введите описание изображения здесь

Jonno
источник
Интересно. Какой вкус регулярных выражений вы проверяли? Я использую regex101.com и тестирую на pcre (php) и python, и он не работает, потому что « Lookbehinds должны быть нулевой ширины, поэтому квантификаторы не допускаются ». Я не потрудился протестировать на javascript, потому что считаю, что негативные взгляды не поддерживаются.
Фицрой
@Fitzroy Это использование .NET регулярных выражений, я не уверен, переводит ли это на конкретный движок регулярных выражений или он сам по себе, я считаю, что это так. Я посмотрю, смогу ли я получить что-то, работающее с regex101.
Джонно
@Fitzroy Добавил идею для вас, можете ли вы использовать ее или нет, я не знаю, потому что я не знаю ваш вариант использования.
Джонно
Я не могу изменить содержимое, к которому я буду применять регулярное выражение.
Фицрой
@ Фитцрой Я не знаю других способов, извини!
Jonno