Classes de caracteres
Uma abertura de colchete introduz uma classe de caracteres, terminada por um fechamento de colchete. Um colchete de fechamento em si não é especial. Se um colchete de fechamento for requerido como membro da classe, ele deve ser o primeiro caractere na classe (após um circunflexo inicial, se presente) ou escapado com uma barra invertida.
Uma classe de caracteres corresponde a um único caractere na string; o caractere precisa estar no conjunto de caracteres definido pela classe, a menos que o primeiro caractere na classe seja um circunflexo, que nesse caso o caractere na string não pode estar no conjunto definido pela classe. Se um circunflexo for requerido como membro da classe, é preciso garantir que ele não seja o primeiro caractere, ou que seja escapado com uma barra invertida.
Por exemplo, a classe de caracteres [aeiou] corresponde a qualquer vogal minúscula sem acento, enquanto que [^aeiou] corresponde a qualquer caractere que não seja uma vogal minúscula sem acento. Observe que um circunflexo é apenas uma notação conveniente para especificar os caracteres que estão na classe enumerando aqueles que não estão. Não é uma afirmação: ela ainda consome um caractere da string de entrada, e falha se o ponteiro atual estiver no final da string.
Quando uma correspodência insensível a maiúsculas/minúsculas é definida, qualquer letra em uma classe representa tanto a forma maiúscula quanto a minúscula, então, por exemplo, uma classe [aeiou] insensível à forma corresponde tanto a "A" quanto a "a", e uma classe [^aeiou] insensível à forma não corresponde a "A", enquanto que um versão sensível à forma corresponderia.
Um caractere de nova linha nunca é tratado de modo especial em classes de caractere, independente da configuração da opção PCRE_DOTALL ou da opção PCRE_MULTILINE. Uma classe como [^a] sempre corresponderá a uma nova linha.
O caractere hífen (sinal de subtração) pode ser usado para especificar uma faixa de caracteres em uma classe. Por exemplo, [d-m] corresponde a qualquer letra entre d e m, inclusive. Se um hífen literal for requerido na classe, ele precisa ser escapado com uma barra invertida ou aparecer em uma posição onde não possa ser confundido com um indicador de faixa, tipicamente como o primeiro ou último caractere na classe.
Não é possível ter o caractere literal "]" como o caractere final de uma faixa. Uma expressão como [W-]46] é interpretada como uma classe de dois caracteres ("W" e "-") seguida pela string literal "46]", portanto corresponderia a "W46]" ou "-46]". Entretanto, se o "]" for escapado com uma barra invertida ele será interpretado como o final da faixa. Assim, [W-\]46] é interpretado como uma classe única contendo uma faixa única seguida por dois caracteres separados. A representação octal ou hexadecimal de "]" também pode ser usada para finalizar uma faixa.
As faixas operam na sequência da tabela ASCII. Elas também podem ser usadas para caracteres especificados numericamente, por exemplo [\000-\037]. Se uma faixa que inclui letras for usada quando uma correspondência insensível a maiúsculas/minúsculas estiver definida, ela corresponderá às letras em ambas as formas. Por exemplo, [W-c] é equivalente a [][\^_`wxyzabc], correspondida de maneira insensível à forma, e se tabelas de caracteres para a localidade "pt-BR" estiverem em uso, [\xc0-\xc3] correspondem à letra A com acentos tanto em maiúsuculas quanto em minúsculas.
Os tipos de caractere \d, \D, \s, \S, \w e \W também podem aparecer em uma classe de caracteres e adicionar à classe os caractares aos quais eles correspondem. Por exemplo, [\dABCDEF] corresponde a qualquer dígito hexadecimal. Um circunflexo pode convenientemente ser usado com os tipos de caracteres maiúsculos para especificar um conjunto mais restrito de caracteres que a correspondência ao tipo de minúsculas. Por exemplo, a classe [^\W_] corresponde a qualquer letra ou dígito, mas não ao sublinhado "_".
Todos os caracteres não alfanuméricos que não sejam \, -, ^ (no início) e o terminador ] não são especiais em classes de caracteres, mas não faz mal agum se forem escapados. O terminador de expressão é sempre especial e precisa ser escapado quando usado dentro de uma expressão.
O Perl suporta a notação POSIX para classes de caracteres. Ela usa nomes
envolvidos por [:
e :]
dentro
de colchetes. O PCRE também
suporta esta notação. Por exemplo, [01[:alpha:]%]
corresponde a "0", "1", qualquer caractere alfabético ou "%". Os nomes de classe
suportados são:
alnum | letras e dígitos |
alpha | letras |
ascii | caracteres com códigos 0 - 127 |
blank | espaço ou tabulação somente |
cntrl | caracteres de controle |
digit | dígitos decimais (o mesmo que \d) |
graph | caracteres imprimíveis, excluindo o espaço |
lower | letras minúsculas |
print | caracteres imprimíveis, incluindo o espaço |
punct | caracteres imprimíveis, excluindo letras e dígitos |
space | espaço (não é idêntico a \s) |
upper | letras maiúsculas |
word | caracteres de "palavra" (o mesmo que \w) |
xdigit | dígitos hexadecimais |
space
são: tabulação horizontal (9), nova linha (10), tabulação vertical (11), alimentação de formulário (12), retorno de carro (13),
e espaço (32). Observe que esta lista inclui o caractere de tabulação vertical (código
11). Isso faz com que "space" seja diferente de \s
, que não inclui a tabulação vertical (para
compatibilidade com o Perl).
O nome word
é uma extensão do Perl, e blank
é uma extensão GNU
do Perl 5.8. Uma outra extensão do Perl é a negação, que é indicada
por um caractere ^
após o caractere de dois-pontos. Por exemplo,
[12[:^digit:]]
corresponde a "1", "2" ou qualquer não-dígito.
No modo UTF-8, caracteres com valores maiores que 127 não correspondem a nenhuma das classes de caracteres POSIX. A partir da libpcre 8.10 algumas classes de caracteres são modificadas para usar proprieadades de caracteres Unicode, e nesse caso a restrição mencionada não se aplica. Refira-se ao » manual PCRE(3) para detalhes.
Propriedades de caracteres Unicode podem aparecer dentro de uma classe de caracteres. Elas não podem ser parte de uma faixa. O caractere hífen após uma classe de caractere Unicode irá corresponder literalmente. Tentar finalizar uma faixa com uma propriedade de caractere Unicode resultará em um alerta.