Was ist der beste Weg, um festzustellen, ob ein Zeichen in Java ein Buchstabe oder eine Zahl ist, ohne Regexe zu verwenden?


125

Was ist der beste und / oder einfachste Weg, um zu erkennen, ob ein string.charAt (Index) ein Az-Buchstabe oder eine Zahl in Java ist, ohne reguläre Ausdrücke zu verwenden? Vielen Dank.

Antworten:


241

Character.isDigit(string.charAt(index))( JavaDoc ) gibt true zurück, wenn es sich um eine Ziffer handelt.
Character.isLetter(string.charAt(index))( JavaDoc ) gibt true zurück, wenn es sich um einen Buchstaben handelt


13
Hinweis: Diese sagen Ihnen, ob das Zeichen ein Unicode-Buchstabe / eine Unicode-Ziffer ist. Das OP bat um "einen Az-Brief" ... was auch immer das bedeutet.
Stephen C

4
Warum besteht der ASCII ├ (255) in meinem Fall? Ich dachte, es ist nur für Az, AZ und 0-9?
Mr5

@ CᴏɴᴏʀO'Bʀɪᴇɴ Links sind jetzt behoben. Danke für die Information.
Adam

12
Verwenden Sie Character.isLetterOrDigit(string.charAt(index))für beide Überprüfungen.
Aspirant9

Seien Sie vorsichtig, isLetterOrDigit gibt auf dem Weg mehr als a-Z0-9 wahr !!!
Lesen Sie

24

Ich suche nach einer Funktion, die nur prüft, ob es sich um einen der lateinischen Buchstaben oder eine Dezimalzahl handelt. Da char c = 255, was in druckfähiger Version ├ ist und als Brief von betrachtet wird Character.isLetter(c). Diese Funktion ist meiner Meinung nach das, wonach die meisten Entwickler suchen:

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

1
Ich habe gerade unseren Code durchgesehen und war erstaunt, wie viele Fehler aufgrund von isLetter und isLetterOrDigit vorhanden waren ... Danke!
fl0w

1
Irgendwie haben Sie Ihre Zeichensätze und / oder Schriftarten durcheinander gebracht. Unicode-Codepunkt u00ffist eigentlich das Zeichen ÿ. (Kleinbuchstaben y mit einem Umlaut.) Der Codepunkt, der ├ darstellt, ist u251c.
Stephen C

@ StephenC Sie haben Recht. Ich habe vergessen, wie ich dieses Zeichen anstelle von nbsp
mr5

Auf Kotlin ist es viel einfacherif (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
Vlad

23

Wie aus den Antworten hervorgeht (wenn Sie sie sorgfältig prüfen!), Ist Ihre Frage nicht eindeutig. Was meinst du mit "einem Az-Buchstaben" oder einer Ziffer?

  • Wenn Sie wissen möchten, ob ein Zeichen ein Unicode- Buchstabe oder eine Ziffer ist, verwenden Sie die Methoden Character.isLetterund Character.isDigit.

  • Wenn Sie wissen möchten, ob ein Zeichen ein ASCII- Buchstabe oder eine ASCII- Ziffer ist, testen Sie am besten, indem Sie die Zeichenbereiche 'a' bis 'z', 'A' bis 'Z' und '0' bis vergleichen '9'.

Beachten Sie, dass alle ASCII-Buchstaben / Ziffern Unicode-Buchstaben / Ziffern sind. Es gibt jedoch viele Unicode-Buchstaben / Ziffern, die keine ASCII-Buchstaben sind. Zum Beispiel akzentuierte Buchstaben, kyrillisch, sanskrit, ...


Die allgemeine Lösung besteht darin, dies zu tun:

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

und testen Sie dann, ob der Block einer der Blöcke ist, an denen Sie interessiert sind. In einigen Fällen müssen Sie mehrere Blöcke testen. Zum Beispiel gibt es (mindestens) 4 Codeblöcke für kyrillische Zeichen und 7 für Latein. Die Character.UnicodeBlockKlasse definiert statische Konstanten für bekannte Blöcke. siehe die Javadocs .

Beachten Sie, dass sich jeder Codepunkt höchstens in einem Block befindet.



8

Ich weiß nicht am besten, aber das scheint mir ziemlich einfach:

Character.isDigit(str.charAt(index))
Character.isLetter(str.charAt(index))

Seien Sie vorsichtig, isLetterOrDigit gibt auf dem Weg mehr als a-Z0-9 wahr !!!
Lesen Sie

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

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


1
Der vorhergehende Code ist falsch, da er nur mit Englisch und einigen anderen Sprachen funktioniert. Um das vorherige Beispiel zu internationalisieren, ersetzen Sie es durch die folgenden Anweisungen: char ch; // ... // Dieser Code ist OK! if (Character.isLetter (ch)) // ... if (Character.isDigit (ch)) // ... if (Character.isSpaceChar (ch)) // ...
Yao Li

OP klar gefragt if a string.charAt(index) is an A-z letter. Wir reden also nicht über andere Sprachen, oder?
Vadasambar

In z. B. Deutsch könnte ein ä als im az-Bereich liegend angesehen werden.
Robert

4

Vergleichen Sie seinen Wert. Es sollte zwischen dem Wert von 'a' und 'z', 'A' und 'Z', '0' und '9' liegen.


1
Dieser manuelle Ansatz ist besser als die eingebaute Character.isLetter()Methode?
IgorGanapolsky

1
@IgorGanapolsky - Es kommt genau darauf an, was Sie versuchen zu tun. Hinweis: Sie machen verschiedene Dinge!
Stephen C

@ StephenC Ich fand Character.isLetter()es rudimentär. Es sei denn, wir sprechen über Internationalisierung?
IgorGanapolsky

1
@IgorGanapolsky - Lesen Sie die Javadocs. Überprüfen Sie dann in den Unicode-Spezifikationen, welche Codepunkte die jeweiligen Zeichenklassen tatsächlich enthalten. >> Natürlich << sprechen wir über Internationalisierung. Zeichen in Java basieren alle auf Unicode.
Stephen C

Wie machst Du das?
John Ktejik

3

Verwenden Sie den folgenden Code

Character.isLetterOrDigit(string.charAt(index))


1
Was fügt Ihre Antwort hinzu, das in den vorherigen Antworten nicht behandelt wurde?
Robert

Seien Sie vorsichtig, isLetterOrDigit gibt auf dem Weg mehr als a-Z0-9 wahr !!!
Lesen Sie

Robert, anstatt zwei Funktionen aufzurufen, können Sie natürlich auch nur eine Funktion aufrufen.
Scheich

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


}
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.