Como usar uma expressão regular de negação "^" para palavras?

Bem, pelo que eu andei encontrando na internet, o pessoal usa esta negação “^” somente para letras… Mas e para palavras inteiras, dá certo?

Um exemplo do que desejo, é:
“Gostaria das palavras Coca ou Pepsi, mas não para a palavra Fanta.” Então procuro algo como “b[/b]”, mas falta a negação da palavra Fanta… E aí que o bicho pega para mim, pois não tenho ideia de como fazer isso…

Andei pensando em algo bruto como: ^([^F]|F[^a]|Fa[^n]|Fan[^t]|Fant[^a])
Mas testando no http://regexpal.com/ não funciona…

Alguém possui alguma sugestão?

Para ajudar nos testes, aqui vai o link direto desse exemplo online:
http://regexpal.com/?flags=&regex=[^%3C]%28Coca|Pepsi%29[^%3E]&input=%3CCoca-Cola%2C%20Fanta%20Uva%3E%0A%3CFanta%20Uva%2C%20Pepsi-Cola%3E%0A%3CPepsi-Cola%2C%20Coca-Cola%3E

  1. Recomendo usar 2 expressões regulares (uma para pegar as coisas que batem, e outra para pegar as coisas que não batem). Isso é mais simples de manter.
  2. O que você quer pode ser feito, em Java, usando-se algum desses padrões abaixo - não sei qual deles:

(?=X) X, via zero-width positive lookahead
(?!X) X, via zero-width negative lookahead
(?<=X) X, via zero-width positive lookbehind
(?<!X) X, via zero-width negative lookbehind

(Veja em http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html ) mas eu concordo que são difíceis de usar corretamente. Prefira usar a abordagem 1) acima.

  1. Consulte sempre: http://aurelio.net/er

Opa, valeu pela resposta…

Bem, eu estava indo para recuperar as duas coisas em uma Regex só… Mas vou tentar a escolha nº 1 :slight_smile:

Vou elaborar duas rotinas…

Mas vou testar como anda o desempenho usando 2 Regex, e outra usando apenas uma rotina Regex, e outra rotina interna no Java (o famoso “contains” da palavra que eu não desejo), e assim mapear em uma lista somente as coisas que desejo…

:!: Valeu pela dica até agora, mas fico aberto a mais dicas de como deixar tudo em uma só Regex, pois creio eu que o desempenho nessa tarefa será melhor colocando tudo em uma só tarefa para o sistema se virar e me buscar somente as palavras desejadas…

Há, pelo http://aurelio.net ele faz conforme eu falei na minha metodologia “bruta”…

Negar a palavra aqui: ^[^a][^q][^u][^i]

http://guia-er.sourceforge.net/negar-palavra.html

O bicho pegou… Pois agora não sei como colocar ela dentro da expressão como um todo…

se eu tenho que negar uma expressão mais complexa como uma palavra inteira prefiro inverter o if ou usar outra coisa que não seja expressão regular sob pena de ficar ilegivel.

[quote=entanglement]1) Recomendo usar 2 expressões regulares (uma para pegar as coisas que batem, e outra para pegar as coisas que não batem). Isso é mais simples de manter.
2) O que você quer pode ser feito, em Java, usando-se algum desses padrões abaixo - não sei qual deles:

(?=X) X, via zero-width positive lookahead
(?!X) X, via zero-width negative lookahead
(?<=X) X, via zero-width positive lookbehind
(?<!X) X, via zero-width negative lookbehind

(Veja em http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html ) mas eu concordo que são difíceis de usar corretamente. Prefira usar a abordagem 1) acima.

  1. Consulte sempre: http://aurelio.net/er
    [/quote]

Pois é, veja o site do Aurélio:

http://guia-er.sourceforge.net/modernosos-nao-atras.html#3_5_6

Ele explica como fazer uma expressão que bate com “Homer Simpson” mas não com “Barney Simpson”. (Acho que deveria ser com “Bart Simpson” :slight_smile: )