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.
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
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:
privatestaticboolean isLetterOrDigit(char c){return(c >='a'&& c <='z')||(c >='A'&& c <='Z')||(c >='0'&& c <='9');}
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, ...
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.
Seien Sie vorsichtig, isLetterOrDigit gibt auf dem Weg mehr als a-Z0-9 wahr !!!
Lesen Sie
5
// 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'))// ...
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.
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.
Character.isLetterOrDigit(string.charAt(index))
für beide Überprüfungen.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 wirdCharacter.isLetter(c)
. Diese Funktion ist meiner Meinung nach das, wonach die meisten Entwickler suchen:quelle
u00ff
ist eigentlich das Zeichen ÿ. (Kleinbuchstaben y mit einem Umlaut.) Der Codepunkt, der ├ darstellt, istu251c
.if (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
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.isLetter
undCharacter.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:
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.UnicodeBlock
Klasse definiert statische Konstanten für bekannte Blöcke. siehe die Javadocs .Beachten Sie, dass sich jeder Codepunkt höchstens in einem Block befindet.
quelle
Die Java Character-Klasse verfügt seit Version 1.0.2 über eine isLetterOrDigit- Methode
quelle
Ich weiß nicht am besten, aber das scheint mir ziemlich einfach:
quelle
Quelle: https://docs.oracle.com/javase/tutorial/i18n/text/charintro.html
quelle
if a string.charAt(index) is an A-z letter
. Wir reden also nicht über andere Sprachen, oder?Vergleichen Sie seinen Wert. Es sollte zwischen dem Wert von 'a' und 'z', 'A' und 'Z', '0' und '9' liegen.
quelle
Character.isLetter()
Methode?Character.isLetter()
es rudimentär. Es sei denn, wir sprechen über Internationalisierung?Verwenden Sie den folgenden Code
Character.isLetterOrDigit(string.charAt(index))
quelle
quelle