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.

Respostas:


241

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


13
Nota: isso indica se o caractere é uma letra / dígito Unicode. O OP pediu "uma carta Az" ... o que isso significa.
Stephen C

4
Por que o ASCII 255 (255) passa no meu caso? Eu pensei que é apenas para az, AZ e 0-9?
Mr5

@ CᴏɴᴏʀO'Bʀɪᴇɴ Os links estão agora corrigidos. Obrigado por me avisar.
Adam

12
Use Character.isLetterOrDigit(string.charAt(index))para as duas verificações.
precisa

Cuidado, pois o isLetterOrDigit oferece mais do que a-Z0-9 !!! consulte o doc aqui docs.oracle.com/javase/7/docs/api/java/lang/...
fl0w

24

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:

private static boolean isLetterOrDigit(char c) {
    return (c >= 'a' && c <= 'z') ||
           (c >= 'A' && c <= 'Z') ||
           (c >= '0' && c <= '9');
}

1
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, ...


A solução geral é fazer isso:

Character.UnicodeBlock block = Character.UnicodeBlock.of(someCodePoint);

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.




5
// check if ch is a letter
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
    // ...

// check if ch is a digit
if (ch >= '0' && ch <= '9')
    // ...

// check if ch is a whitespace
if ((ch == ' ') || (ch =='\n') || (ch == '\t'))
    // ...

Fonte: https://docs.oracle.com/javase/tutorial/i18n/text/charintro.html


1
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'


1
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.
Stephen C

Como você faz isso?
#


0
 import java.util.Scanner;
 public class v{
 public static void main(String args[]){
 Scanner in=new Scanner(System.in);
    String str;
    int l;
    int flag=0;
    System.out.println("Enter the String:");
    str=in.nextLine();
    str=str.toLowerCase();
    str=str.replaceAll("\\s","");
    char[] ch=str.toCharArray();
    l=str.length();
    for(int i=0;i<l;i++){
        if ((ch[i] >= 'a' && ch[i]<= 'z') || (ch[i] >= 'A' && ch[i] <= 'Z')){
        flag=0;
        }
        else

        flag++;
        break;
        } 
if(flag==0)
    System.out.println("Onlt char");


}
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.