Preciso de uma regex que corresponda, blahfooblah
mas nãoblahfoobarblah
Quero que corresponda apenas a foo e tudo ao redor de foo, contanto que não seja seguido por bar.
Tentei usar isto: foo.*(?<!bar)
que é bastante parecido, mas corresponde blahfoobarblah
. O olhar negativo por trás precisa corresponder a qualquer coisa e não apenas à barra.
A linguagem específica que estou usando é o Clojure, que usa regexes Java nos bastidores.
EDIT: Mais especificamente, eu também preciso passar, blahfooblahfoobarblah
mas não blahfoobarblahblah
.
Respostas:
Experimentar:
Testes:
Explicação da expressão regular
Outro regex
Se você deseja excluir apenas
bar
quando for logo apósfoo
, você pode usarEditar
Você atualizou sua pergunta para torná-la específica.
Novos testes
Nova explicação
(?=.*foo(?!bar))
garante que umfoo
seja encontrado, mas não seja seguido diretamentebar
fonte
foo
mas nãofoobar
. Para combinar,bot
mas nãobotters
, você usaria/(?=.*bot(?!ters))^(\w+)$/
.Para corresponder a um
foo
seguimento por algo que não começa combar
, tenteSua versão com lookbehind negativo é efetivamente "corresponde a um
foo
seguido por algo que não termina embar
". O.*
corresponde totalmentebarblah
, e(?<!bar)
olha para tráslah
e verifica se não correspondebar
, o que não é verdade, de modo que todo o padrão coincide.fonte
Em vez disso, use uma previsão negativa:
Isso funcionou para mim, espero que ajude. Boa sorte!
fonte
Você escreveu um comentário sugerindo que isso funcione com a correspondência de todas as palavras em uma string em vez da própria string inteira.
Em vez de misturar tudo isso em um comentário, estou postando como uma nova resposta.
Novo Regex
Texto de amostra
Partidas
fonte
Sua solicitação de correspondência específica pode ser correspondida por:
Isso vai combinar,
blahfooblahfoobarblah
mas nãoblahfoobarblahblah
.O problema com sua regex de
foo.*(?<!bar)
é o.*
depoisfoo
. Corresponde a tantos caracteres, incluindo caracteres posterioresbar
.fonte