Eu estou usando um regex para programar um validador de input para uma checkbox de texto onde eu só quero caracteres alfabéticos. Eu queria saber se [Az]
e [a-zA-Z]
eram equivalentes ou se havia diferença no desempenho.
Eu continuo lendo [a-zA-Z]
nas minhas pesquisas e não menciono [Az]
.
Eu estou usando String.matches(regex)
do java.
[Az]
corresponderá a caracteres ASCII no intervalo de A
a z
, enquanto [a-zA-Z]
corresponderá a caracteres ASCII no intervalo de A
a Z
e no intervalo de z
. À primeira vista, isso pode parecer equivalente – no entanto, se você observar essa tabela de caracteres ASCII, verá que Az
inclui vários outros caracteres. Especificamente, eles são [
, \
, ]
, ^
, _
e “ `(o que você claramente não quer).
As combinações az ‘a’ a ‘z’ AZ combinam ‘A’ a ‘Z’ Az e combinam com todas estas, assim como os caracteres entre ‘Z’ e ‘a’ que são [] ^ / _ `
Consulte http://www.asciitable.com/
Dê uma olhada na tabela ASCII . Você verá que existem alguns caracteres entre Z
e a
, então você vai combinar mais do que você pretendia.
Os colchetes criam uma class de caracteres e o hífen é uma abreviação para adicionar todos os caracteres entre os dois caracteres fornecidos. ou seja, [AF]
pode ser escrito [ABCDEF]
.
A class de caractere [Az]
corresponderá a todos os caracteres entre esses caracteres, que em ASCII inclui alguns outros caracteres, como ‘[‘, ‘\’ e ‘]’.
Uma alternativa para especificar os dois casos seria definir a expressão regular para não diferenciar maiúsculas de minúsculas, usando o modificador /i
.
Quando você der uma olhada na tabela ASCII, você verá o seguinte:
A = 65 Z = 90 a = 97 z = 122
Então, [Az]
irá combinar todos os caracteres de 65 a 122. Isso inclui esses caracteres ( 91 -> 97
) também:
[\]^_`
Isto significa que [A-Za-z]
irá corresponder apenas ao alfabeto, sem os caracteres notados
Dê uma olhada no gráfico ASCII (no qual os caracteres Java são baseados): existem alguns caracteres de pontuação situados entre Z e a, ou seja:
[\]^ _`