Qual è il modo migliore per sapere se un carattere è una lettera o un numero in Java senza utilizzare le espressioni regolari?


125

Qual è il modo migliore e / o più semplice per riconoscere se una stringa.charAt (indice) è una lettera Az o un numero in Java senza utilizzare espressioni regolari? Grazie.

Risposte:


243

Character.isDigit(string.charAt(index))( JavaDoc ) restituirà true se è una cifra
Character.isLetter(string.charAt(index))( JavaDoc ) restituirà true se è una lettera


13
Nota: questi ti dicono se il carattere è una lettera / cifra Unicode. L'OP ha chiesto "una lettera Az" ... qualunque cosa significhi.
Stephen C

4
Perché nel mio caso passa l'ASCII 255 (255)? Pensavo fosse solo per az, AZ e 0-9?
mr5

@ CᴏɴᴏʀO'Bʀɪᴇɴ I collegamenti sono ora corretti. Grazie per avermi fatto sapere.
Adam

14
Utilizzare Character.isLetterOrDigit(string.charAt(index))per entrambe le verifiche.
Aspirant9

Attenzione, isLetterOrDigit restituisce vero più di a-Z0-9 !!! fare riferimento al documento qui docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w

24

Sto cercando una funzione che controlli solo se è una delle lettere latine o un numero decimale. Poiché char c = 255, che nella versione stampabile è e considerato come una lettera di Character.isLetter(c). Questa funzione penso sia ciò che la maggior parte degli sviluppatori sta cercando:

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

1
Ho appena letto il nostro codice e sono rimasto stupito di quanti bug ci fossero a causa di isLetter e isLetterOrDigit ... Grazie!
fl0w

1
In qualche modo hai confuso i tuoi set di caratteri e / o caratteri di visualizzazione. Il punto di codice Unicode u00ffè in realtà il carattere ÿ. (Y minuscola con dieresi.) Il codepoint che rappresenta ├ è u251c.
Stephen C

@StephenC hai ragione. Ho dimenticato come
finisco

Su Kotlin è molto più sempliceif (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
Vlad il

23

Come indicano le risposte (se le esamini attentamente!), La tua domanda è ambigua. Cosa intendi per "una lettera Az" o una cifra?

  • Se vuoi sapere se un carattere è una lettera o una cifra Unicode , usa i metodi Character.isLettere Character.isDigit.

  • Se vuoi sapere se un carattere è una lettera o una cifra ASCII , la cosa migliore da fare è provare confrontando con gli intervalli di caratteri da "a" a "z", "A" a "Z" e "0" a '9'.

Nota che tutte le lettere / cifre ASCII sono lettere / cifre Unicode ... ma ci sono molte lettere / cifre Unicode caratteri che non sono ASCII. Ad esempio, lettere accentate, cirillico, sanscrito, ...


La soluzione generale è fare questo:

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

e poi prova per vedere se il blocco è uno di quelli che ti interessano. In alcuni casi dovrai testare più blocchi. Ad esempio, ci sono (almeno) 4 blocchi di codice per i caratteri cirillici e 7 per il latino. La Character.UnicodeBlockclasse definisce costanti statiche per blocchi noti; vedere i javadoc .

Notare che qualsiasi punto di codice sarà al massimo in un blocco.




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
Il codice precedente è sbagliato perché funziona solo con l'inglese e poche altre lingue. Per internazionalizzare l'esempio precedente, sostituirlo con le seguenti istruzioni: char ch; // ... // Questo codice è OK! if (Character.isLetter (ch)) // ... if (Character.isDigit (ch)) // ... if (Character.isSpaceChar (ch)) // ...
Yao Li

Ha chiesto chiaramente OP if a string.charAt(index) is an A-z letter. Quindi non stiamo parlando di altre lingue, vero?
vadasambar

Ad esempio, in tedesco, una ä potrebbe essere considerata nell'intervallo az.
Robert,

4

Confronta il suo valore. Dovrebbe essere compreso tra il valore di "a" e "z", "A" e "Z", "0" e "9"


1
Questo approccio manuale è migliore del Character.isLetter()metodo integrato ?
IgorGanapolsky

1
@IgorGanapolsky - Dipende esattamente da cosa stai cercando di fare. Suggerimento: fanno cose diverse!
Stephen C

@StephenC ho pensato che fosse Character.isLetter()rudimentale. A meno che non si parli di internazionalizzazione?
IgorGanapolsky

1
@IgorGanapolsky - Leggi i javadoc. Quindi controlla le specifiche Unicode per quali punti di codice contengono effettivamente le rispettive classi di caratteri. >> Certamente << stiamo parlando di internazionalizzazione. I caratteri in Java sono tutti basati su Unicode.
Stephen C

Come fai a fare questo?
john ktejik

3

Usa il codice sottostante

Character.isLetterOrDigit(string.charAt(index))


1
Cosa aggiunge la tua risposta che non è stata trattata nelle risposte precedenti?
Robert,

Attenzione, isLetterOrDigit restituisce vero più di a-Z0-9 !!! fare riferimento al documento qui docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w

Robert, invece di chiamare due funzioni puoi ovviamente chiamare solo una funzione.
sceicco

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


}
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.