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.