-
Hallo Leute,
ich bin noch ein ziemlicher Java-Neuling und bin dabei ein Programm für die Schule zu schreiben, um EAN-Codes zu überprüfen. Zu nächster Woche war es erstmal die Aufgabe, den String, der per Textfeld eingegeben wird, erst zu überprüfen ob er aus 13 Zeichen besteht und dann überprüfen zu lassen, ob in den 13 Zeichen ausversehen ein Buchstabe mit
reingerutscht ist. Ich habe das soweit fast hinbekommen mit Regex. Doch mein Problem ist, dass mein Programm nur einen Fehler zeigt, wenn ein Buchstabe an erster Stelle steht. An den restlichen Stellen im String sagt er gar nichts. Hier mal mein Code:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
// eigene Methoden public int ueberpruefung(String eanc){ int fc = 0; // Überprüfung auf 13 Stellen // ungleich 13, dann fc = 1; if (eanc.length() > 13){ textField1.setText(""); fc = 1; label3.setText("Zu viele Zeichen, EAN bitte erneut Eingeben"); textField1.setText(""); } if (eanc.length() < 13){ textField1.setText(""); fc = 1; label3.setText("Zu wenig Zeichen, EAN bitte erneut Eingeben"); textField1.setText(""); } //wenn fc = 0; dann // Überprüfung auf Ziffern if (eanc.matches("^(\\D.*)*$")) { label3.setText("In dem Barcode ist ein Zeichen enthalten, bitte erneut eingeben"); System.out.println(eanc.matches("[a-zA-Z]")); // Nur Kontrolle System.out.println("In dem Barcode ist ein Zeichen enthalten, bitte erneut eingeben"); // Kontrolle } return fc; } // Anfang Methoden public void button1_ActionPerformed(ActionEvent evt) { // TODO hier Quelltext einfügen String eingabe = ""; int fehlercode = 0; eingabe = textField1.getText(); fehlercode = ueberpruefung(eingabe); System.out.println(fehlercode); /*if (eingabe.matches("^(\\D.*)*$")) { label3.setText("In dem Barcode ist ein Zeichen enthalten, bitte erneut eingeben"); System.out.println(eingabe.matches("[a-zA-Z]")); // Kontrolle System.out.println("In dem Barcode ist ein Zeichen enthalten, bitte erneut eingeben"); // Kontrolle }*/ }
Ich hoffe ihr könnt mir irgendwie helfen, diesen dämlichen Fehler zu beseitigen...
MfG
-
Dein Ausdruck ist komplizierter, als er sein müsste.
Code java:1
if (!eanc.matches("^[0-9]{13}$")) {
Edit: Oder um näher an deiner Lösung zu bleiben
Code java:1
if (eanc.lookingAt("\\D")) {
Geändert von CPoly (21.08.11 um 18:45 Uhr)
-
Lag es jetzt an dem was in der Klammer stand, oder an dem ausrufungszeichen? Was bewirkt dieses eigentlich?
Großen Dank an Dich
-
Mich wundert, dass ihr mit regulären Ausdrücken arbeitet, aber den !-Operator nicht kennt? Dieser invertiert einen boolschen Wert. also: (!true == false). In dem Fall wird der if-Block ausgeführt, wenn der Ausdruck NICHT matcht. Das ist viel einfacher als die Negierung im Ausdruck unterzubringen.
Ich sagte ja, ich werde aus deinem Ausdruck nicht schlau, deshalb kann ich dir auch keinen genauen Fehler sagen. Erstmal hast du in der Klammer sowas wie "Ein Zeichen, dass keine Zahl ist, gefolgt von beliebig vielen anderen Zeichen" und das ganze dann noch beliebig oft. Aber eigentlich willst du doch nur wissen, ob in der Eingabe etwas vor kommt, was keine Zahl ist. Also prüf einfach ob irgendwo eine nicht-Zahl drin ist (lookAt("\\D")).
Der erste Ausdruck den ich gepostet hab, sagt ja aus "Genau dreizehn Zahlen". Und deshalb prüfe ich, ob das NICHT zutrifft (mit dem Ausrufezeichen).
-
Okay, vielen Dank für die Erklärung

Das was in der Klammer stand, war auch nur mein letzter Versuch, sonst hatte ich halt immer so sachen wie eanc.matches("\\D"). Welches aber auch nicht funktioniert hat. Dann bin ich irgendwie auf das gekommen was halt zuletzt drin stand und das hat dann wenigstens bei der ersten Ziffer funktioniert
Bezüglich des !-Operators bzw. halt regex. Uns wurde ja nicht gesagt wie wir das machen sollen, habe nur freiwillig das Programm fortführen wollen & bin dann darauf gestoßen und wollte es nun irgenwie lösen
Vielen Dank nochmal
-
eanc.matches("\\D") war ja fast perfekt. Du hast nur übersehen, dass matches den gesamten Text prüft, wohingegen lookingAt irgendwo innerhalb des Textes sucht. Deshalb kann man bei meiner Lösung mit eanc.matches("^[0-9]{13}$") auch die Start- und Endmarkierungen weglassen. eanc.matches("[0-9]{13}")
-
Okay, das bringt natürlich etwas Licht ins dunkle

Hab meinen Code jetzt noch etwas angepasst und habe jetzt das Problem, dass wenn ich entweder zu viele Ziffern eingebe, dass trotz nicht vorhandenem Buchstaben der Fehler ausgegeben wird, dass ein Buchstabe vorhanden ist. Dies passiert auch, wenn es weniger als 13 Ziffern sind. Hier noch einmal mein angepasster Code:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
public int ueberpruefung(String eanc){ int fc = 0; int laenge = eanc.length() - 13; // Überprüfung auf 13 Stellen // ungleich 13, dann fc = 1; if (eanc.length() != 13){ textField1.setText(""); fc = 1; if(laenge > 0){ label3.setText("Zu viele Zeichen, EAN bitte erneut Eingeben"); } else { label3.setText("Zu wenig Zeichen, EAN bitte erneut Eingeben"); } } if (!eanc.matches("[0-9]{13}")) { label3.setText("In dem Barcode ist ein Buchstabe enthalten, bitte erneut eingeben"); System.out.println("In dem Barcode ist ein Buchstabe enthalten, bitte erneut eingeben"); } return fc; } // Anfang Methoden public void button1_ActionPerformed(ActionEvent evt) { // TODO hier Quelltext einfügen String eingabe = ""; int fehlercode = 0; eingabe = textField1.getText(); fehlercode = ueberpruefung(eingabe); System.out.println(fehlercode); }
Wäre super nett wenn du mir noch einmal behilflich sein könntest
MfG
-
22.08.11 17:45 #8SE Tutorials.de Gastzugang
Das liegt daran weil RegEx prüft ob 13 auf ein ander folgende Zahlen vorhanden sind. Wenn du jetzt natürlich mehr oder weniger Zahlen angibst ist die RegEx gnau so false als wenn Buchstaben drin wären. Allerdings hat die RegEx eine Schwachstelle : gibst du eine Folge von Buchstaben und Zahlen ein bei der irgendwo 13 Zahlen am Stück enthalten sind ist die RegEx true wenn z.B. diese 13 Zahlen von 2 Buchstaben begrentzt werden. Dann kannst du nämlich alles als Input verwenden.
-
Und wie kann ich dieses Problem jetzt lösen? Habe gerade das mit .lookingAt versucht, doch kennt er diesen Befehl nicht. Ich steh hier grad echt auf'm Schlauch -.-
MfG
-
22.08.11 18:20 #10SE Tutorials.de Gastzugang
Nun , du könntest bevor du auf die Zahlen prüfst mit
erstmal darauf prüfen ob nicht-Zahlen enthalten sind , also wenn matcher.matches() true returned in einer if()-Abfrage darauf reagieren. Im else Block kannst du dann mitCode java:1 2
Pattern pattern=Pattern.compile("\\D+"); Matcher matcher=pattern.match(input);
prüfen ob auch wirklich nur 13 Zahlen eingegeben wurden.Code java:1 2
Pattern pattern=Pattern.compile("\\d{13}"); Matcher matcher=pattern.match();
Geändert von SE (22.08.11 um 18:21 Uhr) Grund: TYPO
-
Eben nicht. Das ist ja der Unterschied zwischen matches und lookingAt.
Ich dachte irgendwie "eanc" wäre eine Instanz von Matcher, aber es ist ja nur ein String. Also musst du erst eine Instanz davon erstellen. (ist alles im pakage java.util.regex)
Code java:1
if ( Pattern.compile("\\D").matcher( eanc ).lookingAt() ) {
-
22.08.11 18:50 #12SE Tutorials.de Gastzugang
-
Magst du mir die Zeile eben erklären, das ist nämlich etwas zu viel auf einmal für einen Neuling wie mich, um dieses zu verstehen. Habe das jetzt so gemacht wie von dir geschrieben:
Code java:1 2 3 4
if ( Pattern.compile("\\D").matcher( eanc ).lookingAt() ) { label3.setText("In dem Barcode ist ein Buchstabe enthalten, bitte erneut eingeben"); System.out.println("In dem Barcode ist ein Buchstabe enthalten, bitte erneut eingeben"); }
Bloß jetzt zeigt er den Fehler wieder einmal nur, wenn ein Buchstabe an erster Stelle steht. Das verwirrt mich langsam echt
MfG
-
Ja, ich hab mich doch geirrt. Nimm "find" anstelle von "lookingAt".
matches: Gesamter Text muss passen
lookingAt: Der Anfang des Textes muss passen
find: Irgendwas innerhalb des Textes muss passen
Jetzt den Code erklärt (Normalerweise schreib man nicht alles in eine Zeile :-D):
Code java:1
if ( Pattern.compile("\\D").matcher( eanc ).find() ) {
Code java:1 2 3 4 5 6 7 8
//Kompiliert den Ausdruck für die Weitere Verwendung und liefert eine Instanz von Pattern Pattern.compile("\\D") //Die zurückgegebene Instanz von Pattern wird auf den Text angewendet und man erhält eine Instanz von Matcher, um die damit weiter zu arbeiten .matcher( eans ) //Wir rufen die find-Methode der Matcher Instanz auf, um mit dem vorher kompilierten Ausdruck im Text zu suchen. Liefert true/false .find()
-
Ich danke dir, tausende male

Endlich klappt das so, wie ich das will. Kannst du mir evtl. ein Buch empfehlen, nach dem man sich in Sachen Java richten kann, bzw. nach dem man die Prog. Sprache ausführlich lernt? Der Unterricht in der Schule lässt schon etwas zu wünschen übrig und ich würde gerne mehr können.
Danke dir nochmal
MfG
Ähnliche Themen
-
Regex Hilfe...
Von SonMiko im Forum PHPAntworten: 8Letzter Beitrag: 23.01.11, 20:48 -
RegEx hilfe
Von hoctar im Forum PHPAntworten: 4Letzter Beitrag: 13.09.09, 19:11 -
[Python] Regex Hilfe
Von chmee im Forum CGI, Perl, Python, Ruby, Power ShellAntworten: 2Letzter Beitrag: 07.06.09, 12:27 -
Hilfe bei Regex (mit preg_replace)
Von Miraculixx im Forum PHPAntworten: 2Letzter Beitrag: 22.09.07, 12:27 -
Hilfe bei Regex...
Von okieh im Forum Coders TalkAntworten: 3Letzter Beitrag: 17.05.05, 08:40



9Danke

Zitieren


Login





