Qual é a melhor maneira de saber se um caractere é uma letra ou número em Java sem usar expressões regulares?
125
Qual é a melhor e / ou mais fácil maneira de reconhecer se um string.charAt (index) é uma letra ou um número Az em Java sem usar expressões regulares? Obrigado.
Character.isDigit(string.charAt(index))( JavaDoc ) retornará verdadeiro se for um dígito Character.isLetter(string.charAt(index))( JavaDoc ) retornará verdadeiro se for uma letra
Estou procurando uma função que verifique apenas se é uma das letras latinas ou um número decimal. Desde char c = 255, que na versão imprimível é ├ e considerado como uma carta por Character.isLetter(c). Esta função eu acho que é o que a maioria dos desenvolvedores está procurando:
privatestaticboolean isLetterOrDigit(char c){return(c >='a'&& c <='z')||(c >='A'&& c <='Z')||(c >='0'&& c <='9');}
Acabei de ler nosso código e ficou espantado com quantos bugs havia por causa de isLetter e isLetterOrDigit ... Obrigado!
Fl0w 6/03/19
1
De alguma forma, você misturou seus conjuntos de caracteres e / ou exibe fontes. O ponto de código Unicode u00ffé realmente o caractere ÿ. (Y minúsculo com trema.) O ponto de código que representa ├ é u251c.
Stephen C
@StephenC você está certo. Eu esqueci como acabei digitando esse caractere em vez de nbsp
mr5 03/06
No Kotlin é muito mais simplesif (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
Vlad
23
Como as respostas indicam (se você as examinar com cuidado!), Sua pergunta é ambígua. O que você quer dizer com "uma letra Az" ou um dígito?
Se você deseja saber se um caractere é uma letra ou dígito Unicode , use os métodos Character.isLettere Character.isDigit.
Se você deseja saber se um caractere é uma letra ou dígito ASCII , a melhor coisa a fazer é testar comparando com os intervalos de caracteres 'a' a 'z', 'A' a 'Z' e '0' a '9'.
Observe que todas as letras / dígitos ASCII são letras / dígitos Unicode ... mas existem muitos caracteres / letras Unicode que não são ASCII. Por exemplo, letras acentuadas, cirílico, sânscrito, ...
e teste para ver se o bloco é um do seu interesse. Em alguns casos, você precisará testar vários blocos. Por exemplo, existem (pelo menos) 4 blocos de código para caracteres cirílicos e 7 para latim. A Character.UnicodeBlockclasse define constantes estáticas para blocos conhecidos; veja os javadocs .
Observe que qualquer ponto de código estará no máximo em um bloco.
// check if ch is a letterif((ch >='a'&& ch <='z')||(ch >='A'&& ch <='Z'))// ...// check if ch is a digitif(ch >='0'&& ch <='9')// ...// check if ch is a whitespaceif((ch ==' ')||(ch =='\n')||(ch =='\t'))// ...
O código anterior está errado porque funciona apenas com inglês e alguns outros idiomas. Para internacionalizar o exemplo anterior, substitua-o pelas seguintes instruções: char ch; // ... // Este código está OK! if (Character.isLetter (ch)) // ... if (Character.isDigit (ch)) // ... if (Character.isSpaceChar (ch)) // ...
Yao Li
OP perguntou claramente if a string.charAt(index) is an A-z letter. Então, não estamos falando de outras línguas, estamos?
vadasambar
Por exemplo, alemão, um ä pode ser considerado na faixa az.
Robert
4
Compare seu valor. Deve estar entre o valor de 'a' e 'z', 'A' e 'Z', '0' e '9'
Essa abordagem manual é melhor que o Character.isLetter()método interno?
IgorGanapolsky
1
@IgorGanapolsky - Depende exatamente do que você está tentando fazer. Dica: eles fazem coisas diferentes!
Stephen C
@StephenC eu pensei que Character.isLetter()é rudimentar. A menos que estejamos falando sobre internacionalização?
IgorGanapolsky
1
@IgorGanapolsky - Leia os javadocs. Em seguida, verifique as especificações Unicode para quais pontos de código as respectivas classes de caracteres realmente contêm. >> Claro que estamos falando de internacionalização. Os caracteres em Java são todos baseados em Unicode.
Character.isLetterOrDigit(string.charAt(index))
para as duas verificações.Estou procurando uma função que verifique apenas se é uma das letras latinas ou um número decimal. Desde
char c = 255
, que na versão imprimível é ├ e considerado como uma carta porCharacter.isLetter(c)
. Esta função eu acho que é o que a maioria dos desenvolvedores está procurando:fonte
u00ff
é realmente o caractere ÿ. (Y minúsculo com trema.) O ponto de código que representa ├ éu251c
.if (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
Como as respostas indicam (se você as examinar com cuidado!), Sua pergunta é ambígua. O que você quer dizer com "uma letra Az" ou um dígito?
Se você deseja saber se um caractere é uma letra ou dígito Unicode , use os métodos
Character.isLetter
eCharacter.isDigit
.Se você deseja saber se um caractere é uma letra ou dígito ASCII , a melhor coisa a fazer é testar comparando com os intervalos de caracteres 'a' a 'z', 'A' a 'Z' e '0' a '9'.
Observe que todas as letras / dígitos ASCII são letras / dígitos Unicode ... mas existem muitos caracteres / letras Unicode que não são ASCII. Por exemplo, letras acentuadas, cirílico, sânscrito, ...
A solução geral é fazer isso:
e teste para ver se o bloco é um do seu interesse. Em alguns casos, você precisará testar vários blocos. Por exemplo, existem (pelo menos) 4 blocos de código para caracteres cirílicos e 7 para latim. A
Character.UnicodeBlock
classe define constantes estáticas para blocos conhecidos; veja os javadocs .Observe que qualquer ponto de código estará no máximo em um bloco.
fonte
A classe Java Character possui um método isLetterOrDigit desde a versão 1.0.2
fonte
Não sei o que é melhor, mas isso me parece bastante simples:
fonte
Fonte: https://docs.oracle.com/javase/tutorial/i18n/text/charintro.html
fonte
if a string.charAt(index) is an A-z letter
. Então, não estamos falando de outras línguas, estamos?Compare seu valor. Deve estar entre o valor de 'a' e 'z', 'A' e 'Z', '0' e '9'
fonte
Character.isLetter()
método interno?Character.isLetter()
é rudimentar. A menos que estejamos falando sobre internacionalização?Use o código abaixo
Character.isLetterOrDigit(string.charAt(index))
fonte
fonte