Jaki jest najlepszy sposób na sprawdzenie, czy znak jest literą czy cyfrą w Javie bez użycia wyrażeń regularnych?

125

Jaki jest najlepszy i / lub najłatwiejszy sposób na rozpoznanie, czy string.charAt (indeks) jest literą Az czy liczbą w Javie bez używania wyrażeń regularnych? Dzięki.

Daniel Sopel
źródło

Odpowiedzi:

243

Character.isDigit(string.charAt(index))( JavaDoc ) zwróci wartość true, jeśli jest to cyfra
Character.isLetter(string.charAt(index))( JavaDoc ) zwróci wartość true, jeśli jest to litera

Adam
źródło
13
Uwaga: te informują, czy znak jest literą / cyfrą Unicode. OP poprosił o „list Az”… cokolwiek to znaczy.
Stephen C
4
Dlaczego ASCII ├ (255) przechodzi w moim przypadku? Myślałem, że to tylko dla az, AZ i 0-9?
mr5
@ CᴏɴᴏʀO'Bʀɪᴇɴ Linki są teraz naprawione. Dzięki, że dałeś mi znać.
Adam
14
Użyj Character.isLetterOrDigit(string.charAt(index))do obu weryfikacji.
Aspirant9
Uważaj, isLetterOrDigit daje prawdę o wiele więcej niż a-Z0-9 !!! zapoznaj się z dokumentem tutaj docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w
24

Szukam funkcji, która sprawdza tylko, czy jest to jedna z liter łacińskich, czy liczba dziesiętna. Ponieważ char c = 255, który w wersji do druku to i jest traktowany jako litera wg Character.isLetter(c). Myślę, że ta funkcja jest tym, czego szuka większość programistów:

private static boolean isLetterOrDigit(char c) {
    return (c >= 'a' && c <= 'z') ||
           (c >= 'A' && c <= 'Z') ||
           (c >= '0' && c <= '9');
}
mr5
źródło
1
Właśnie przejrzałem nasz kod i byłem zdumiony, ile błędów jest w nim z powodu isLetter i isLetterOrDigit ... Dziękuję!
fl0w
1
W jakiś sposób pomieszałeś zestawy znaków i / lub czcionki wyświetlania. Punktem kodowym Unicode u00ffjest właściwie znak ÿ. (Małe y z umlautem). Punkt kodowy reprezentujący ├ to u251c.
Stephen C
@StephenC masz rację. Zapomniałem, jak w końcu
wpisuję
Na Kotlinie jest znacznie prościejif (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
Vlad
23

Jak wskazują odpowiedzi (jeśli dokładnie je przeanalizujesz!), Twoje pytanie jest niejednoznaczne. Co masz na myśli przez „literę Az” lub cyfrę?

  • Jeśli chcesz wiedzieć, czy znak jest literą czy cyfrą Unicode , użyj metod Character.isLetteri Character.isDigit.

  • Jeśli chcesz wiedzieć, czy znak jest literą lub cyfrą ASCII , najlepszym rozwiązaniem jest porównanie z zakresami znaków „a” do „z”, „A” do „Z” i „0” do „9”.

Zauważ, że wszystkie litery / cyfry ASCII są literami / cyframi Unicode ... ale istnieje wiele znaków / cyfr Unicode, które nie są znakami ASCII. Na przykład litery akcentowane, cyrylica, sanskryt, ...


Ogólnym rozwiązaniem jest zrobienie tego:

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

a następnie sprawdź, czy dany blok jest jednym z tych, które Cię interesują. W niektórych przypadkach będziesz musiał przetestować wiele bloków. Na przykład istnieją (co najmniej) 4 bloki kodu dla znaków cyrylicy i 7 dla znaków łacińskich. Character.UnicodeBlockKlasa definiuje statyczne stałe dla dobrze znanych bloków; zobacz javadocs .

Zauważ, że każdy punkt kodowy będzie znajdował się co najwyżej w jednym bloku.

Stephen C.
źródło
8

Nie wiem, co najlepsze, ale wydaje mi się to dość proste:

Character.isDigit(str.charAt(index))
Character.isLetter(str.charAt(index))
Cameron
źródło
Uważaj, isLetterOrDigit daje prawdę o wiele więcej niż a-Z0-9 !!! zapoznaj się z dokumentem tutaj docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w
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'))
    // ...

Źródło: https://docs.oracle.com/javase/tutorial/i18n/text/charintro.html

vadasambar
źródło
1
Poprzedni kod jest nieprawidłowy, ponieważ działa tylko w języku angielskim i kilku innych językach. Aby umiędzynarodowić poprzedni przykład, zastąp go następującymi instrukcjami: char ch; // ... // Ten kod jest OK! if (Character.isLetter (ch)) // ... if (Character.isDigit (ch)) // ... if (Character.isSpaceChar (ch)) // ...
Yao Li
OP wyraźnie zapytał if a string.charAt(index) is an A-z letter. Więc nie mówimy o innych językach, prawda?
vadasambar
Na przykład w języku niemieckim ä można uznać za należące do zakresu az.
Robert
4

Porównaj jego wartość. Powinien zawierać się między wartościami „a” i „z”, „A” i „Z”, „0” i „9”

YuppieNetworking
źródło
1
To ręczne podejście jest lepsze niż Character.isLetter()metoda wbudowana ?
Igor Ganapolsky
1
@IgorGanapolsky - To zależy dokładnie od tego, co próbujesz zrobić. Wskazówka: robią różne rzeczy!
Stephen C
@StephenC Myślę, że Character.isLetter()jest elementarny. Chyba że mówimy o internacjonalizacji?
Igor Ganapolsky
1
@IgorGanapolsky - Przeczytaj javadocs. Następnie sprawdź specyfikacje Unicode, aby dowiedzieć się, jakie punkty kodowe faktycznie zawierają odpowiednie klasy znaków. >> Oczywiście << mówimy o internacjonalizacji. Wszystkie znaki w Javie są oparte na Unicode.
Stephen C
jak Ty to robisz?
john ktejik
3

Użyj poniższego kodu

Character.isLetterOrDigit(string.charAt(index))

Ram Repaka
źródło
1
Co dodaje Twoja odpowiedź, czego nie uwzględniono w poprzednich odpowiedziach?
Robert
Uważaj, isLetterOrDigit daje prawdę o wiele więcej niż a-Z0-9 !!! zapoznaj się z dokumentem tutaj docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w
Robercie, zamiast wywoływać dwie funkcje, możesz oczywiście wywołać jedną funkcję.
szejk
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");


}
}
Gowtham Prasath
źródło