
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)
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.