Expressão regular - onde a string contém 'bar', mas não é precedida por 'foo'

Expressão regular - onde a string contém 'bar', mas não é precedida por 'foo'

Atualmente tenho uma expressão regular para corresponder onde uma string contém 'bar', mas não é precedida por 'foo':

(?<!foo)bar

Desejo modificar o regex para corresponder ao local onde uma string contém 'bar', mas não é precedida por 'foo' e (opcionalmente) quaisquer caracteres adicionais.

POR EXEMPLO. 'footestbar' não deve corresponder, pois bar é precedido por 'foo' seguido de 'test'.

Não consigo encontrar uma maneira de conseguir isso, pois as expressões regulares não permitem o uso de um quantificador em um lookbehind negativo. Posteriormente, não posso fazer o seguinte:

(?<!foo.*)bar

Existe uma abordagem alternativa?

ATUALIZAR:
O sabor da expressão regular ére2. Atualmente estou revisando a documentação, mas à primeira vista notei o seguinte:

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

Portanto, a solução não pode usar um lookbehind negativo (se estou interpretando a documentação corretamente).

Responder1

Postagem alterada

Portanto, parece que alguns (a maioria?) mecanismos Regex funcionam apenas com um lookbehind de comprimento fixo. No entanto, eles parecem bem em aceitar uma antecipação de comprimento variável. Não tenho certeza de qual é o seu caso de uso ou quão viável seria, mas uma ideia poderia ser reverter sua string e usar:

rab(?!.*oof)

insira a descrição da imagem aqui

Claro, parece ridículo e não sei como você o usará ou quão útil será. A maior parte da minha experiência com Regex tem sido usando .NET e, na maioria das vezes, não é necessário olhar por trás. Só uma ideia para você..!

Postagem original - Funciona apenas com determinados mecanismos Regex (testado usando .NET)

Experimente o seguinte regex:

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

Isso adiciona um grupo opcional e sem captura dentro da mesma aparência negativa.

insira a descrição da imagem aqui

informação relacionada