¿Cuál es la mejor manera de saber si un carácter es una letra o un número en Java sin usar expresiones regulares?


125

¿Cuál es la mejor y / o más fácil forma de reconocer si un string.charAt (index) es una letra Az o un número en Java sin usar expresiones regulares? Gracias.

Respuestas:


242

Character.isDigit(string.charAt(index))( JavaDoc ) devolverá verdadero si es un dígito
Character.isLetter(string.charAt(index))( JavaDoc ) devolverá verdadero si es una letra


13
Nota: que estos le dicen si el carácter es una letra / dígito Unicode. El OP pidió "una letra Az" ... lo que sea que eso signifique.
Stephen C

44
¿Por qué pasa el ASCII ├ (255) en mi caso? ¿Pensé que era solo para az, AZ y 0-9?
mr5

@ CᴏɴᴏʀO'Bʀɪᴇɴ Los enlaces ahora están arreglados. Gracias por hacérmelo saber.
Adam

13
Úselo Character.isLetterOrDigit(string.charAt(index))tanto para las verificaciones.
Aspirante9

¡Cuidado, isLetterOrDigit da verdad en mucho más que a-Z0-9! consulte el documento aquí docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w

24

Estoy buscando una función que verifique solo si es una de las letras latinas o un número decimal. Desde entonces char c = 255, que en la versión imprimible es y se considera como una letra por Character.isLetter(c). Creo que esta función es lo que buscan la mayoría de los desarrolladores:

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

1
Acabo de leer nuestro código y me sorprendió la cantidad de errores que había allí debido a isLetter e isLetterOrDigit ... ¡Gracias!
fl0w

1
De alguna manera, ha confundido sus conjuntos de caracteres o las fuentes de visualización. El punto de código Unicode u00ffes en realidad el carácter ÿ. (Minúscula y con una diéresis). El punto de código que representa ├ es u251c.
Stephen C

@StephenC tienes razón. Olvidé cómo termino escribiendo ese personaje en lugar de nbsp
mr5

En Kotlin es mucho más simpleif (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
Vlad

23

Como indican las respuestas (¡si las examina cuidadosamente!), Su pregunta es ambigua. ¿Qué quieres decir con "una letra Az" o un dígito?

  • Si desea saber si un carácter es una letra o dígito Unicode , utilice los métodos Character.isLettery Character.isDigit.

  • Si desea saber si un carácter es una letra o dígito ASCII , lo mejor que puede hacer es realizar una prueba comparando con los rangos de caracteres 'a' a 'z', 'A' a 'Z' y '0' a '9'.

Tenga en cuenta que todas las letras / dígitos ASCII son letras / dígitos Unicode ... pero hay muchas letras / dígitos Unicode que no son ASCII. Por ejemplo, letras acentuadas, cirílicas, sánscritas, ...


La solución general es hacer esto:

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

y luego pruebe para ver si el bloque es uno de los que le interesan. En algunos casos, deberá probar varios bloques. Por ejemplo, hay (al menos) 4 bloques de código para caracteres cirílicos y 7 para latín. La Character.UnicodeBlockclase define constantes estáticas para bloques conocidos; ver los javadocs .

Tenga en cuenta que cualquier punto de código estará como máximo en un bloque.




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'))
    // ...

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


1
El código anterior es incorrecto porque solo funciona con inglés y algunos otros idiomas. Para internacionalizar el ejemplo anterior, reemplácelo con las siguientes declaraciones: char ch; // ... // ¡Este código está bien! if (Character.isLetter (ch)) // ... if (Character.isDigit (ch)) // ... if (Character.isSpaceChar (ch)) // ...
Yao Li

OP claramente preguntó if a string.charAt(index) is an A-z letter. ¿Entonces no estamos hablando de otros idiomas?
vadasambar

Por ejemplo, en alemán, se puede considerar que un ä está en el rango az.
Robert

4

Compara su valor. Debe estar entre el valor de 'a' y 'z', 'A' y 'Z', '0' y '9'


1
¿Este enfoque manual es mejor que el Character.isLetter()método incorporado ?
IgorGanapolsky

1
@IgorGanapolsky: depende precisamente de lo que intente hacer. Pista: ¡hacen cosas diferentes!
Stephen C

@StephenC, pensé que Character.isLetter()es rudimentario. ¿A menos que estemos hablando de internacionalización?
IgorGanapolsky

1
@IgorGanapolsky - Lee los javadocs. Luego verifique las especificaciones Unicode para saber qué puntos de código contienen las clases de caracteres respectivas. >> Por supuesto << estamos hablando de internacionalización. Los caracteres en Java están todos basados ​​en Unicode.
Stephen C

¿Cómo haces esto?
John Ktejik

3

Usa el siguiente código

Character.isLetterOrDigit(string.charAt(index))


1
¿Qué agrega su respuesta que no se ha cubierto en las respuestas anteriores?
Robert

¡Cuidado, isLetterOrDigit da verdad en mucho más que a-Z0-9! consulte el documento aquí docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w

Robert, en lugar de llamar a dos funciones, por supuesto, solo puedes llamar a una función.
jeque

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");


}
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.