Índice Anterior Próxima

Negação de uma palavra

Está gostando da leitura? Está aprendendo? Compre o livro novo que traz mais conteúdo, texto atualizado e ilustrações!

Vamos agora esclarecer um mito da mitologia ERística: como negar uma palavra. Resposta: depende. Depende da posição dela na linha ou se seu aplicativo suporta os metacaracteres modernosos. Por enquanto esquecendo estes, temos que o único metacaractere que proíbe alguma coisa é a lista negada, mas ela vale apenas para a posição de um caractere, não tendo como proibir uma palavra. Intuitivamente e de sopetão, as tentativas de negar a palavra aqui poderiam ser coisas como:

[^aqui], (^aqui) e [^(aqui)]

O que, como sabemos, são inválidos pois o primeiro nega os quatro caracteres em qualquer ordem, para uma posição, o segundo é um grupo que casa a palavra no começo da linha e o último é uma viagem astral, simplesmente negando todos os caracteres da lista, em qualquer ordem. O que fazer então? Se, e somente se a palavra sempre estiver no começo ou fim da linha, a âncora nos dá a base e podemos fazer uma seqüência de listas negadas de um caractere, completando a palavra, assim:

^[^a][^q][^u][^i]

Mas como cada lista é independente uma da outra, qualquer uma que falhe é suficiente para falhar a ER toda. Isso significa que qualquer linha que comece com a, seja aonde, agora ou assim, falhará a primeira lista negada e com ela toda a ER. Para lidar com isso, precisamos amarrar a seqüência das letras, em uma ER gigante, feia e literal, mas que funciona:

^( [^a] | a[^q] | aq[^u] | aqu[^i] )

Note que os espaços em branco foram colocados para facilitar a leitura apenas, eles não fazem parte da ER. Vamos fazer a leitura dela para clarificar. A primeira letra da linha não pode ser um a . Se for, este não pode ser seguido de um q. Se for, este aq não pode ser seguido por um u, mas caso seja, em hipótese alguma a próxima pode ser um i. Se for, falhou a ER e conseguimos ignorar a palavra aqui no começo da linha. Ufa! Se a palavra fosse no fim da linha, basta usar o cifrão, aliás, acho que nem precisava falar isso né? E se você não quisesse a palavra chato também?

^([^a]|a[^q]|aq[^u]|aqu[^i]|[^c]|c[^h]|ch[^a]|...)

E assim vai, podendo ficar quilométrica. Mas funciona. Se for no meio da linha, esqueça, pois qualquer linha casará, mesmo as que contenham a palavra proibida. Tome como exemplo a frase "o aqui é proibido.". Aplicando a ER quilométrica apresentada, mesmo sem a âncora ela casa no começo da linha na maior cara-de-pau:

o aqui é proibido.
xxxx

Então a ER casa o aq, considerando a frase válida e o que era para ser proibido, passou... O motivo é simples e esse problema nunca terá solução, pois as ERs são orientadas a caracteres e repetições para casar um texto. O que precisaríamos aqui é algo que não case caracteres em seqüência, sob qualquer contexto. As ERs não foram feitas para isso.

Negar uma palavra, só no começo ou fim da linha.

Mas como não poderia deixar de ser, esta regra também tem uma exceção. Legal né? Você se lembra do tópico dos metacaracteres modernosos? Mais especificamente o (?!...). No nosso exemplo em questão, a ER ficaria (?!aqui), pois esse metacaractere fará a ER falhar caso encontre um aqui na linha.

Para ficar mais simples, você pode considerar essa construção uma "lista negada de ERs", que casa qualquer coisa fora o que casar a ER contida. Em nosso caso as ER eram apenas caracteres literais, mas poderia ser uma ER tão complicada quanto se precise. Levando-se isso em conta, fica aqui nossa conclusão:

Há como negar uma ou mais palavras, em apenas alguns aplicativos.

Índice Anterior Próxima