Quelle est la meilleure façon de savoir si un caractère est une lettre ou un nombre en Java sans utiliser de regex?
125
Quel est le moyen le meilleur et / ou le plus simple de reconnaître si une chaîne.charAt (index) est une lettre Az ou un nombre en Java sans utiliser d'expressions régulières? Merci.
Character.isDigit(string.charAt(index))( JavaDoc ) retournera vrai si c'est un chiffre Character.isLetter(string.charAt(index))( JavaDoc ) retournera vrai s'il s'agit d'une lettre
Je recherche une fonction qui vérifie uniquement s'il s'agit d'une des lettres latines ou d'un nombre décimal. Depuis char c = 255, qui en version imprimable est ├ et considéré comme une lettre par Character.isLetter(c). Cette fonction, je pense, est ce que la plupart des développeurs recherchent:
privatestaticboolean isLetterOrDigit(char c){return(c >='a'&& c <='z')||(c >='A'&& c <='Z')||(c >='0'&& c <='9');}
Je viens de parcourir notre code et j'ai été étonné du nombre de bogues à cause de isLetter et isLetterOrDigit ... Merci!
fl0w
1
D'une manière ou d'une autre, vous avez mélangé vos jeux de caractères et / ou vos polices d'affichage. Le point de code Unicode u00ffest en fait le caractère ÿ. (Y minuscule avec un tréma.) Le point de code qui représente ├ est u251c.
Stephen C
@StephenC vous avez raison. J'ai oublié comment je
finis
Sur Kotlin, c'est beaucoup plus simpleif (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
Vlad le
23
Comme l'indiquent les réponses (si vous les examinez attentivement!), Votre question est ambiguë. Qu'entendez-vous par "une lettre Az" ou un chiffre?
Si vous voulez savoir si un caractère est une lettre ou un chiffre Unicode , utilisez les méthodes Character.isLetteret Character.isDigit.
Si vous voulez savoir si un caractère est une lettre ou un chiffre ASCII , la meilleure chose à faire est de tester en comparant avec les plages de caractères 'a' à 'z', 'A' à 'Z' et '0' à «9».
Notez que toutes les lettres / chiffres ASCII sont des lettres / chiffres Unicode ... mais il existe de nombreuses lettres / chiffres Unicode qui ne sont pas ASCII. Par exemple, lettres accentuées, cyrillique, sanskrit, ...
puis testez pour voir si le bloc est l'un de ceux qui vous intéressent. Dans certains cas, vous devrez tester plusieurs blocs. Par exemple, il existe (au moins) 4 blocs de code pour les caractères cyrilliques et 7 pour le latin. La Character.UnicodeBlockclasse définit des constantes statiques pour des blocs bien connus; voir les javadocs .
Notez que tout point de code sera dans au plus un bloc.
// 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'))// ...
Le code précédent est erroné car il ne fonctionne qu'avec l'anglais et quelques autres langues. Pour internationaliser l'exemple précédent, remplacez-le par les instructions suivantes: char ch; // ... // Ce code est OK! if (Character.isLetter (ch)) // ... if (Character.isDigit (ch)) // ... if (Character.isSpaceChar (ch)) // ...
Yao Li
OP a clairement demandé if a string.charAt(index) is an A-z letter. Alors on ne parle pas d'autres langues n'est-ce pas?
vadasambar le
En allemand, par exemple, un ä pourrait être considéré comme étant dans la plage az.
Robert
4
Comparez sa valeur. Il doit être compris entre les valeurs «a» et «z», «A» et «Z», «0» et «9»
Cette approche manuelle est meilleure que la Character.isLetter()méthode intégrée ?
IgorGanapolsky
1
@IgorGanapolsky - Cela dépend précisément de ce que vous essayez de faire. Indice: ils font des choses différentes!
Stephen C
@StephenC J'ai pensé que c'était Character.isLetter()rudimentaire. À moins que l'on ne parle d'internationalisation?
IgorGanapolsky
1
@IgorGanapolsky - Lisez les javadocs. Vérifiez ensuite les spécifications Unicode pour savoir quels points de code les classes de caractères respectives contiennent réellement. >> Bien sûr << nous parlons d'internationalisation. Les caractères en Java sont tous basés sur Unicode.
Character.isLetterOrDigit(string.charAt(index))
pour les deux vérifications.Je recherche une fonction qui vérifie uniquement s'il s'agit d'une des lettres latines ou d'un nombre décimal. Depuis
char c = 255
, qui en version imprimable est ├ et considéré comme une lettre parCharacter.isLetter(c)
. Cette fonction, je pense, est ce que la plupart des développeurs recherchent:la source
u00ff
est en fait le caractère ÿ. (Y minuscule avec un tréma.) Le point de code qui représente ├ estu251c
.if (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
Comme l'indiquent les réponses (si vous les examinez attentivement!), Votre question est ambiguë. Qu'entendez-vous par "une lettre Az" ou un chiffre?
Si vous voulez savoir si un caractère est une lettre ou un chiffre Unicode , utilisez les méthodes
Character.isLetter
etCharacter.isDigit
.Si vous voulez savoir si un caractère est une lettre ou un chiffre ASCII , la meilleure chose à faire est de tester en comparant avec les plages de caractères 'a' à 'z', 'A' à 'Z' et '0' à «9».
Notez que toutes les lettres / chiffres ASCII sont des lettres / chiffres Unicode ... mais il existe de nombreuses lettres / chiffres Unicode qui ne sont pas ASCII. Par exemple, lettres accentuées, cyrillique, sanskrit, ...
La solution générale est de faire ceci:
puis testez pour voir si le bloc est l'un de ceux qui vous intéressent. Dans certains cas, vous devrez tester plusieurs blocs. Par exemple, il existe (au moins) 4 blocs de code pour les caractères cyrilliques et 7 pour le latin. La
Character.UnicodeBlock
classe définit des constantes statiques pour des blocs bien connus; voir les javadocs .Notez que tout point de code sera dans au plus un bloc.
la source
La classe Java Character a une méthode isLetterOrDigit depuis la version 1.0.2
la source
Je ne sais pas ce qu'il y a de mieux, mais cela me semble assez simple:
la source
Source: https://docs.oracle.com/javase/tutorial/i18n/text/charintro.html
la source
if a string.charAt(index) is an A-z letter
. Alors on ne parle pas d'autres langues n'est-ce pas?Comparez sa valeur. Il doit être compris entre les valeurs «a» et «z», «A» et «Z», «0» et «9»
la source
Character.isLetter()
méthode intégrée ?Character.isLetter()
rudimentaire. À moins que l'on ne parle d'internationalisation?Utilisez le code ci-dessous
Character.isLetterOrDigit(string.charAt(index))
la source
la source