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.
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
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:
privatestaticboolean isLetterOrDigit(char c){return(c >='a'&& c <='z')||(c >='A'&& c <='Z')||(c >='0'&& c <='9');}
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, ...
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.
// 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'))// ...
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”
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.
Character.isLetterOrDigit(string.charAt(index))
do obu weryfikacji.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 wgCharacter.isLetter(c)
. Myślę, że ta funkcja jest tym, czego szuka większość programistów:źródło
u00ff
jest właściwie znak ÿ. (Małe y z umlautem). Punkt kodowy reprezentujący ├ tou251c
.if (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
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.isLetter
iCharacter.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:
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.UnicodeBlock
Klasa 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.
źródło
Klasa znaków Java ma metodę isLetterOrDigit od wersji 1.0.2
źródło
Nie wiem, co najlepsze, ale wydaje mi się to dość proste:
źródło
Źródło: https://docs.oracle.com/javase/tutorial/i18n/text/charintro.html
źródło
if a string.charAt(index) is an A-z letter
. Więc nie mówimy o innych językach, prawda?Porównaj jego wartość. Powinien zawierać się między wartościami „a” i „z”, „A” i „Z”, „0” i „9”
źródło
Character.isLetter()
metoda wbudowana ?Character.isLetter()
jest elementarny. Chyba że mówimy o internacjonalizacji?Użyj poniższego kodu
Character.isLetterOrDigit(string.charAt(index))
źródło
źródło