Hilfe mit Regex

Specter

Grünschnabel
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:
// 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.

Java:
if (!eanc.matches("^[0-9]{13}$")) {


Edit: Oder um näher an deiner Lösung zu bleiben

Java:
if (eanc.lookingAt("\\D")) {
 
Zuletzt bearbeitet:
Lag es jetzt an dem was in der Klammer stand, oder an dem ausrufungszeichen? Was bewirkt dieses eigentlich?

Großen Dank an Dich ;)
 
Lag es jetzt an dem was in der Klammer stand, oder an dem ausrufungszeichen? Was bewirkt dieses eigentlich?

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 :D

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 :D

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 :D

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 :D
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:
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 :D

MfG
 
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
 
Nun , du könntest bevor du auf die Zahlen prüfst mit
Java:
Pattern pattern=Pattern.compile("\\D+");
Matcher matcher=pattern.match(input);
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 mit
Java:
Pattern pattern=Pattern.compile("\\d{13}");
Matcher matcher=pattern.match();
prüfen ob auch wirklich nur 13 Zahlen eingegeben wurden.
 
Zuletzt bearbeitet von einem Moderator:
Zurück