char c = string.charAt(0);
isDigit =(c >='0'&& c <='9');
Oder die langsameren Regex-Lösungen:
s.substring(0,1).matches("\\d")// or the equivalent
s.substring(0,1).matches("[0-9]")
Bei jeder dieser Methoden müssen Sie jedoch zuerst sicherstellen, dass die Zeichenfolge nicht leer ist. Wenn es ist, charAt(0)und substring(0, 1)wird ein werfen StringIndexOutOfBoundsException. startsWithhat dieses Problem nicht.
Um die gesamte Bedingung einzeilig zu machen und Längenprüfungen zu vermeiden, können Sie die regulären Ausdrücke wie folgt ändern:
s.matches("\\d.*")// or the equivalent
s.matches("[0-9].*")
Wenn die Bedingung in Ihrem Programm nicht in einer engen Schleife angezeigt wird, ist es unwahrscheinlich, dass der geringe Leistungseinbruch bei der Verwendung regulärer Ausdrücke erkennbar ist.
Betreff: "Sie müssen zuerst sicherstellen, dass die Zeichenfolge nicht leer ist" - true und darüber hinaus - Sie müssen auch sicherstellen, dass sie nicht null ist, als ob alle angezeigten Methoden Ausnahmen auslösen würden. Sie können entweder direkt überprüfen (zB ((null!=s) && Character.isDigit(s.charAt(0)) )) oder Tricks wieCharacter.isDigit((s?s:"X").charAt(0))
epeleg
8
Reguläre Ausdrücke sind ein sehr starkes, aber teures Werkzeug. Es ist gültig, sie zu verwenden, um zu überprüfen, ob das erste Zeichen eine Ziffer ist, aber es ist nicht so elegant :) Ich bevorzuge diesen Weg:
publicboolean isLeadingDigit(finalString value){finalchar c = value.charAt(0);return(c >='0'&& c <='9');}
1) functionist nicht Java. 2) Dies erlaubt nur arabische Ziffern, nicht chinesische, indische usw. Das ist vielleicht das, was Sie bevorzugen, aber es ist nicht in der Frage angegeben. 3) Diese genaue Lösung habe ich bereits vor vier Jahren in meiner Antwort behandelt.
Michael Myers
0
regular expression starts with number->'^[0-9]'Pattern pattern =Pattern.compile('^[0-9]');Matcher matcher = pattern.matcher(String);if(matcher.find()){System.out.println("true");}
Sie benötigen das {1,1}Suffix nicht, was bedeutet, dass "das vorhergehende Muster zwischen 1 und 1 Mal erscheinen muss". Dies bedeutet genau das gleiche wie das Muster für sich.
Andrzej Doyle
Diese Lösung funktioniert nicht, da String.matches und Pattern API versuchen, die vollständige Zeichenfolge und nicht nur das erste Zeichen abzugleichen
Amrish Pandey
0
Ich bin gerade auf diese Frage gestoßen und habe darüber nachgedacht, mit einer Lösung beizutragen, die keinen regulären Ausdruck verwendet.
In meinem Fall verwende ich eine Hilfsmethode:
publicboolean notNumber(String input){boolean notNumber =false;try{// must not start with a number@SuppressWarnings("unused")double checker =Double.valueOf(input.substring(0,1));}catch(Exception e){
notNumber =true;}return notNumber;}
Wahrscheinlich ein Overkill, aber ich versuche, Regex zu vermeiden, wann immer ich kann.
Antworten:
Beachten Sie, dass dies jede Unicode-Ziffer zulässt , nicht nur 0-9. Vielleicht bevorzugen Sie:
Oder die langsameren Regex-Lösungen:
Bei jeder dieser Methoden müssen Sie jedoch zuerst sicherstellen, dass die Zeichenfolge nicht leer ist. Wenn es ist,
charAt(0)
undsubstring(0, 1)
wird ein werfenStringIndexOutOfBoundsException
.startsWith
hat dieses Problem nicht.Um die gesamte Bedingung einzeilig zu machen und Längenprüfungen zu vermeiden, können Sie die regulären Ausdrücke wie folgt ändern:
Wenn die Bedingung in Ihrem Programm nicht in einer engen Schleife angezeigt wird, ist es unwahrscheinlich, dass der geringe Leistungseinbruch bei der Verwendung regulärer Ausdrücke erkennbar ist.
quelle
((null!=s) && Character.isDigit(s.charAt(0)) )
) oder Tricks wieCharacter.isDigit((s?s:"X").charAt(0))
Reguläre Ausdrücke sind ein sehr starkes, aber teures Werkzeug. Es ist gültig, sie zu verwenden, um zu überprüfen, ob das erste Zeichen eine Ziffer ist, aber es ist nicht so elegant :) Ich bevorzuge diesen Weg:
quelle
function
ist nicht Java. 2) Dies erlaubt nur arabische Ziffern, nicht chinesische, indische usw. Das ist vielleicht das, was Sie bevorzugen, aber es ist nicht in der Frage angegeben. 3) Diese genaue Lösung habe ich bereits vor vier Jahren in meiner Antwort behandelt.quelle
{1,1}
Suffix nicht, was bedeutet, dass "das vorhergehende Muster zwischen 1 und 1 Mal erscheinen muss". Dies bedeutet genau das gleiche wie das Muster für sich.Ich bin gerade auf diese Frage gestoßen und habe darüber nachgedacht, mit einer Lösung beizutragen, die keinen regulären Ausdruck verwendet.
In meinem Fall verwende ich eine Hilfsmethode:
Wahrscheinlich ein Overkill, aber ich versuche, Regex zu vermeiden, wann immer ich kann.
quelle