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

5 respostas
edsonlopes

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

5 Respostas

E
  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
edsonlopes

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…

edsonlopes

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…

peczenyj

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.

T

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

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

Criado 12 de maio de 2010
Ultima resposta 12 de mai. de 2010
Respostas 5
Participantes 4