¿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.
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
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:
privatestaticboolean isLetterOrDigit(char c){return(c >='a'&& c <='z')||(c >='A'&& c <='Z')||(c >='0'&& c <='9');}
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, ...
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.
// 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'))// ...
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'
¿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.
Character.isLetterOrDigit(string.charAt(index))
tanto para las verificaciones.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 porCharacter.isLetter(c)
. Creo que esta función es lo que buscan la mayoría de los desarrolladores:fuente
u00ff
es en realidad el carácter ÿ. (Minúscula y con una diéresis). El punto de código que representa ├ esu251c
.if (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
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.isLetter
yCharacter.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:
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.UnicodeBlock
clase 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.
fuente
La clase de caracteres Java tiene un método isLetterOrDigit desde la versión 1.0.2
fuente
No sé lo mejor, pero esto me parece bastante simple:
fuente
Fuente: https://docs.oracle.com/javase/tutorial/i18n/text/charintro.html
fuente
if a string.charAt(index) is an A-z letter
. ¿Entonces no estamos hablando de otros idiomas?Compara su valor. Debe estar entre el valor de 'a' y 'z', 'A' y 'Z', '0' y '9'
fuente
Character.isLetter()
método incorporado ?Character.isLetter()
es rudimentario. ¿A menos que estemos hablando de internacionalización?Usa el siguiente código
Character.isLetterOrDigit(string.charAt(index))
fuente
fuente