Índice Anterior Próxima

Lista negada: a experiente [^...]

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

Nem tão exigente quanto a lista nem tão necessitada quanto o ponto, temos a lista negada, que pelas suas más experiências passadas, sabe o que não serve para ela casar.

Ei ei ei, você disse que não ia mais falar sobre lista!!!

É rapidinho. A lista negada é exatamente igual à lista, podendo ter caracteres literais, intervalos e classes POSIX. Tudo o que se aplica a lista normal, se aplica à negada também.

A única diferença é que ela possui lógica inversa, ou seja, ela casará com qualquer coisa, fora os componentes listados.

Observe que a diferença em sua notação é que o primeiro caractere da lista é um circunflexo, ele indica que esta é uma lista negada. Então se [0-9] são números, [^0-9] é qualquer coisa fora números. Pode ser letras, símbolos, espaço em branco, qualquer coisa, menos números.

Mas tem de ser alguma coisa. Só porque ela é uma lista negada isso não significa que ela pode casar "nada".

Explicando em outras palavras, se você diz "qualquer coisa fora números", deve haver outra coisa no lugar dos números e não simplesmente "se não houver números". Então essa ER não casaria uma linha vazia por exemplo.

"Qualquer coisa fora alguns caracteres" não inclui "nenhum caractere".

Como o traço e o colchete que fecha, o circunflexo é especial, então para colocarmos um ^ literal em uma lista, precisamos pô-lo em qualquer posição que não seja a primeira. Assim [A-Z^] casa maiúsculas e o circunflexo e [^A-Z^] casa tudo fora isso.

Ah! As classes POSIX também podem ser negadas, então [^[:digit:]] casa "qualquer coisa fora números".

A lista negada é muito útil quando você sabe exatamente o que não pode ter em uma posição, como um erro ortográfico ou de escrita. Por exemplo, como mandam as regras da boa escrita, sempre após caracteres de pontuação como a vírgula ou o ponto, devemos ter um espaço em branco os separando do resto do texto. Então vamos procurar por qualquer coisa que não o espaço após a pontuação:

[:;,.!?][^ ]

Ou, ainda, explicitando melhor nosso objetivo:

[[:punct:]][^ ]

Resumão


Índice Anterior Próxima