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.

Réponses:


243

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


13
Remarque: cela vous indique si le caractère est une lettre / un chiffre Unicode. Le PO a demandé "une lettre Az" ... quoi que cela signifie.
Stephen C

4
Pourquoi l'ASCII ├ (255) passe-t-il dans mon cas? Je pensais que c'était pour az, AZ et 0-9 seulement?
mr5

Les liens @ CᴏɴᴏʀO'Bʀɪᴇɴ sont désormais corrigés. Merci de me le faire savoir.
Adam le

14
Utilisez Character.isLetterOrDigit(string.charAt(index))pour les deux vérifications.
Aspirant9

Attention, isLetterOrDigit donne vrai plus que a-Z0-9 !!! reportez-vous au doc ​​ici docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w

24

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:

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

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


La solution générale est de faire ceci:

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

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.




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

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


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


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

comment est-ce que tu fais ça?
john ktejik

3

Utilisez le code ci-dessous

Character.isLetterOrDigit(string.charAt(index))


1
Qu'ajoute votre réponse qui n'a pas été abordé dans les réponses précédentes?
Robert

Attention, isLetterOrDigit donne vrai plus que a-Z0-9 !!! reportez-vous au doc ​​ici docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w

Robert, au lieu d'appeler deux fonctions, vous pouvez bien sûr n'en appeler qu'une seule.
cheikh

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


}
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.