G
Guest
Gast
Gibt es eine elegantere Möglichkeit einen String auf Ziffern zu überprüfen (0-9) ohne gleich eine riesen Switch-Case anweisung oder 10 if-Abfragen zu implementieren?
if("2132341".matches("\\d+")){
System.out.println("zahlen");
}
String test1 = "Dies ist der 2. Test."; // soll true ergeben
String test2 = "dies ist der zweite test"; // soll false ergeben
String test3 = "Dies ist der zweite Test"; // soll false ergeben
Anonymous hat gesagt.:Insgesamt muss ich einen String überprüfen und der String muss aus Klein-, Großbuchstaben und Ziffern (0-9) bestehen. Das mit den Klein- und Großbuchstaben hatte ich schon anders gelöst, aber scheinbar kann man ja auch alle drei Abfragen in eine einzige Anweisung packen.
string.matches("[a-zA-z0-9]*")
String s = "...";
char c;
for (int i=0; i<s.length(); i++) {
c = s.charAt(i);
if (c < 58 && c > 47) System.out.println("Zeichen "+i+" ist eine Ziffer");
if (c < 123 && c > 96) System.out.println("Zeichen "+i+" ist ein Kleinbuchstabe");
if (c < 91 && c > 64) System.out.println("Zeichen "+i+" ist ein Großbuchstabe");
}
String[] test = new String[3];
test[0] = "Dies ist der 2. Test."; // soll true ergeben
test[1] = "dies ist der zweite test"; // soll false ergeben
test[2] = "Dies ist der zweite Test"; // soll false ergeben
for (int i=0;i<3;i++){
if(test[i].matches(".*[\\d+].*")){
System.out.println("zahlen");
}else{
System.out.println("keine zahlen");
}
}
Backwardsman hat gesagt.:ich verteidigere mal wieder die alternative methode (ohne reguläre ausdrücke und abwärtskompatibel ;-) ):
Code:String s = "..."; char c; for (int i=0; i<s.length(); i++) { c = s.charAt(i); if (c < 58 && c > 47) System.out.println("Zeichen "+i+" ist eine Ziffer"); if (c < 123 && c > 96) System.out.println("Zeichen "+i+" ist ein Kleinbuchstabe"); if (c < 91 && c > 64) System.out.println("Zeichen "+i+" ist ein Großbuchstabe"); }
Jonnsn hat gesagt.:das sollte doch auch gehen oder?
Code:String[] test = new String[3]; test[0] = "Dies ist der 2. Test."; // soll true ergeben test[1] = "dies ist der zweite test"; // soll false ergeben test[2] = "Dies ist der zweite Test"; // soll false ergeben for (int i=0;i<3;i++){ if(test[i].matches(".*[\\d+].*")){ System.out.println("zahlen"); }else{ System.out.println("keine zahlen"); } }
na dann zeig mir mal bitte eine plattform, welche nicht mit ascii arbeitet!LR hat gesagt.:Ich würde mal sehr stark bezweifeln, daß dieser Vorschlag eine vernünftige Alternative ist, zumal ich ja Plattformunabhängigkeit haben möchte. Und die geprüften Bereiche müssen nicht immer das enthalten, was Du darin vermutest.
Niki hat gesagt.:so gehts auch, ist ein wenig kürzer:
Code:"1223sadfasf32ASFasf".matches("[\\w]*");
war doch auch gefragt?!Niki hat gesagt.:Dein Pattern gibt an dass irgendwo im String mindestens eine Ziffer vorkommen muss, das kann daher das auch sein:
asfasf1asfasdf
Backwardsman hat gesagt.:na dann zeig mir mal bitte eine plattform, welche nicht mit ascii arbeitet!LR hat gesagt.:Ich würde mal sehr stark bezweifeln, daß dieser Vorschlag eine vernünftige Alternative ist, zumal ich ja Plattformunabhängigkeit haben möchte. Und die geprüften Bereiche müssen nicht immer das enthalten, was Du darin vermutest.
boah, stinkts hier nach eigenlob ;-)Verjigorm hat gesagt.:außerdem sieht er bei meinem Beispiel besser, wie er sowas aufbauen kann ^^
Verjigorm hat gesagt.:Niki hat gesagt.:so gehts auch, ist ein wenig kürzer:
Code:"1223sadfasf32ASFasf".matches("[\\w]*");
da ist noch der "Unterstrich" dabei, davon war keine Rede
außerdem sieht er bei meinem Beospiel besser, wie er sowas aufbauen kann ^^
Jonnsn hat gesagt.:war doch auch gefragt?!Niki hat gesagt.:Dein Pattern gibt an dass irgendwo im String mindestens eine Ziffer vorkommen muss, das kann daher das auch sein:
asfasf1asfasdf
:### :?Anonymous hat gesagt.:Zunächst mal danke, aber wie mache ich das wenn es kein reiner Zahlenstring ist sondern auch andere Zeichen enthält?
Insgesamt muss ich einen String überprüfen und der String muss aus Klein-, Großbuchstaben und Ziffern (0-9) bestehen. Das mit den Klein- und Großbuchstaben hatte ich schon anders gelöst, aber scheinbar kann man ja auch alle drei Abfragen in eine einzige Anweisung packen.
Code:String test1 = "Dies ist der 2. Test."; // soll true ergeben String test2 = "dies ist der zweite test"; // soll false ergeben String test3 = "Dies ist der zweite Test"; // soll false ergeben
na, dann werd ich auch noch ein bisschen klugscheißenLR hat gesagt.:IBM z/OS arbeitet z.B. auf ebcdic Basis
noch fragen? ;-)Als eine der größten Hürden bei der Portierung des C-Teils der Referenzimplementierung
erwies sich die Tatsache, daß OS/390 intern EBCDIC benutzt, um Character-
Daten zu kodieren. So wurde entschieden, die C-Strings in ASCII zu kodieren, welches
von den meisten (anderen) Plattformen verwendet wird. Dieser Ansatz machte es notwendig,
eine Art “virtuelle Grenze” um die Java VM zu ziehen: Alle Character-Daten
innerhalb der Java VM werden in ASCII kodiert und nur dann nach EBCDIC konvertiert,
wenn sie die virtuelle Grenze verlassen, um zum Beispiel auf dem Terminal
ausgegeben zu werden. Dies ermöglichte es der Java VM, so zu operieren, als ob sie
auf einer ASCII-basierten Plattform zum Einsatz käme.
Quelle: Architekturanalyse der Java Virtual Machine unter z/OS und Linux - Marc Beyerle
"noch andere zeichen enthält" schließt auch Sonderzeichen nicht aus oder?Niki hat gesagt.:ja, aber du hast .* in deinem Pattern und das steht für jedes Zeichen, also auch Sonderzeichen.
Niki hat gesagt.:Insgesamt muss ich einen String überprüfen und der String muss aus Klein-, Großbuchstaben und Ziffern (0-9) bestehen
string.matches("[a-zA-z0-9]*")
"Dies ist der 2. Test.".matches("[a-zA-z0-9]*");
Backwardsman hat gesagt.:na, dann werd ich auch noch ein bisschen klugscheißenLR hat gesagt.:IBM z/OS arbeitet z.B. auf ebcdic Basis
noch fragen? ;-)Als eine der größten Hürden bei der Portierung des C-Teils der Referenzimplementierung
erwies sich die Tatsache, daß OS/390 intern EBCDIC benutzt, um Character-
Daten zu kodieren. So wurde entschieden, die C-Strings in ASCII zu kodieren, welches
von den meisten (anderen) Plattformen verwendet wird. Dieser Ansatz machte es notwendig,
eine Art “virtuelle Grenze” um die Java VM zu ziehen: Alle Character-Daten
innerhalb der Java VM werden in ASCII kodiert und nur dann nach EBCDIC konvertiert,
wenn sie die virtuelle Grenze verlassen, um zum Beispiel auf dem Terminal
ausgegeben zu werden. Dies ermöglichte es der Java VM, so zu operieren, als ob sie
auf einer ASCII-basierten Plattform zum Einsatz käme.
Quelle: Architekturanalyse der Java Virtual Machine unter z/OS und Linux - Marc Beyerle
if (c >= '0' && c <= '9')
oh mann, was ist das denn für ein klugscheißer-thread :-D ... ich weiß ja nicht, was du in deine Strings so reinschreibst... bei mir sind das typischerweise nur die zeichen 32 bis 126... und die juckt es nicht ob sie jetzt ascii oder unicode zugeordnet werden!Anonymous hat gesagt.:1. Java verwendet nicht ASCII, sondern Unicode
das stimmt natürlich... wurde aber bereits als "unsauber" abgestempelt ;-)2. Warum kryptische Zahlen verwenden, wenn man auch mit char vergleichen kann?
Code:if (c >= '0' && c <= '9')