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
^
literal não deve ser o primeiro item da lista.