Os metacaracteres do tipo barra-letra são átomos representados por uma barra invertida \
seguida de uma letra qualquer, como \s
e \W
. Dependendo da letra, muda-se o significado desse metacaractere.
Contando que o alfabeto nos dá 26 letras e que maiúsculas são diferentes de minúsculas, duplicamos para 52 metacaracteres novos. Calma, nem todas as letras estão ocupadas... Ainda &:)
Tudo começou nas linguagens de programação com os printf
da vida, que começaram a interpretar coisas, como \n
e \t
, para significar quebra de linha e TAB, pois visualmente é ambíguo se "1 2" é um, TAB, dois ou um, espaços, dois.
Exceto estes, havia outros barra-letra para representar aqueles caracteres de controle chatos que de vez em quando aparecem em nossa vida e são difíceis de ver e representar.
Essa representação simplificada e útil se tornou padrão e hoje a grande maioria dos aplicativos os entende. Eis a lista:
b-l nome tradução ---------------------------------------------------- \a alert alerta (bipe) \b backspace caractere Backspace \e escape caractere Esc \f form feed alimentação \n newline linha nova \r carriage ret retorno de carro \t htab tabulação horizontal \v vtab tabulação vertical
Como esses barra-letras também poderiam ser muito úteis para escrever nossas expressões regulares, os robozinhos começaram a ter suporte a eles também, ou senão a linguagem recebe a ER como um dado do tipo string e os interpreta, passando ao robozinho seus valores literais. Mais detalhes sobre isso no tópico "ERs Pré-Processadas e Cruas" adiante.
Ah! Note que o \b
se confunde com a borda. Cada aplicativo trata essa exceção à sua maneira: ou só é válido dentro da lista, ou depende do contexto, ou...
Aí é aquela história: onde passa boi, passa boiada. Observaram bem as classes POSIX, com aquela representação extensa e feia, depois compararam com os barra-letra, que são curtos e charmosos e foi um estalo: criaram barra-letras novos para representar as classes mais utilizadas.
São como "apelidos", pois têm a mesma funcionalidade de seu equivalente POSIX, levando em conta a localização do sistema (acentuação), o que muito nos interessa.
b-l POSIX equiv. mnemônico ------------------------------------------- \d [[:digit:]] dígito \D [^[:digit:]] não-dígito \w [[:alnum:]_] palavra \W [^[:alnum:]_] não-palavra \s [[:space:]] branco \S [^[:space:]] não-branco
Geralmente um barra-LETRA é a negação de um barra-letra.
A grande diferença desses barra-letras para as classes POSIX, é que eles são válidos fora das listas.
Dependendo do aplicativo, eles são válidos dentro das listas também, bagunçando aquela regra que vimos de que dentro da lista todo mundo é normal. Dependendo também, o sublinhado faz parte ou não do \w
.
Com os poderes barra-letrísticos recém-adquiridos, podemos diminuir nossa ER para casar o RG:
[0-9]\.[0-9]{3}\.[0-9]{3}-[0-9] \d\.\d{3}\.\d{3}-\d
Mas aí, como já estava feita a festa e ainda sobravam muitas letras do alfabeto, começaram a aparecer barra-letras aleatórios. Segue uma coletânea misturada deles, encontrados apenas em alguns poucos aplicativos, então confirme antes de usá-los:
b-l significado similar ----------------------------------------------------- \a alfabeto [[:alpha:]] \A não-alfabeto [^[:alpha:]] \h cabeça de palavra [[:alpha]_] \H não-cabeça de palavra [^[:alpha:]_] \l minúsculas [[:lower:]] \L não-minúsculas [^[:lower:]] \u maiúsculas [[:upper:]] \U não-maiúsculas [^[:upper:]] \o número octal [0-7] \O não-número octal [^0-7] \B não-borda \A início do texto \Z fim do texto \l torna minúscula \L torna minúscula até \E \u torna maiúscula \U torna maiúscula até \E \Q escapa até \E \E fim da modificação \G fim do casamento anterior
Conclusão: agora lhe resta procurar na documentação de seu aplicativo, se os barra-letras são suportados, se sim, se pelo robozinho ou pela interpretação de strings, quais barra-letras, e se são válidos dentro e/ou fora das listas.
Nossa! Essa "padronização" das implementações de expressões regulares realmente impressiona...