tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
16
ZUGRIFFE
465
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Specter Specter ist offline Mitglied
    Registriert seit
    Apr 2011
    Beiträge
    12
    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
     

  2. #2
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    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)
    Specter bedankt sich. 

  3. #3
    Specter Specter ist offline Mitglied
    Registriert seit
    Apr 2011
    Beiträge
    12
    Lag es jetzt an dem was in der Klammer stand, oder an dem ausrufungszeichen? Was bewirkt dieses eigentlich?

    Großen Dank an Dich
     

  4. #4
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Zitat Zitat von Specter Beitrag anzeigen
    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).
    Specter bedankt sich. 

  5. #5
    Specter Specter ist offline Mitglied
    Registriert seit
    Apr 2011
    Beiträge
    12
    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
     

  6. #6
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    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}")
    Specter bedankt sich. 

  7. #7
    Specter Specter ist offline Mitglied
    Registriert seit
    Apr 2011
    Beiträge
    12
    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
     

  8. #8
    SE 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.
    Specter bedankt sich. 

  9. #9
    Specter Specter ist offline Mitglied
    Registriert seit
    Apr 2011
    Beiträge
    12
    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
     

  10. #10
    SE Tutorials.de Gastzugang
    Nun , du könntest bevor du auf die Zahlen prüfst mit
    Code java:
    1
    2
    
    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
    Code java:
    1
    2
    
    Pattern pattern=Pattern.compile("\\d{13}");
    Matcher matcher=pattern.match();
    prüfen ob auch wirklich nur 13 Zahlen eingegeben wurden.
    Geändert von SE (22.08.11 um 18:21 Uhr) Grund: TYPO
    Specter bedankt sich. 

  11. #11
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Zitat Zitat von SPiKEe Beitrag anzeigen
    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.
    Eben nicht. Das ist ja der Unterschied zwischen matches und lookingAt.


    Zitat Zitat von Specter Beitrag anzeigen
    Habe gerade das mit .lookingAt versucht, doch kennt er diesen Befehl nicht.
    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() ) {
    Specter bedankt sich. 

  12. #12
    SE Tutorials.de Gastzugang
    Zitat Zitat von CPoly Beitrag anzeigen
    Eben nicht. Das ist ja der Unterschied zwischen matches und lookingAt
    Mein Post war ja auch auf das Matcher.matches() bezogen.
    siehe Zeile 16 in Post #7
    Specter bedankt sich. 

  13. #13
    Specter Specter ist offline Mitglied
    Registriert seit
    Apr 2011
    Beiträge
    12
    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
     

  14. #14
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    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()
    Specter bedankt sich. 

  15. #15
    Specter Specter ist offline Mitglied
    Registriert seit
    Apr 2011
    Beiträge
    12
    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

  1. Regex Hilfe...
    Von SonMiko im Forum PHP
    Antworten: 8
    Letzter Beitrag: 23.01.11, 20:48
  2. RegEx hilfe
    Von hoctar im Forum PHP
    Antworten: 4
    Letzter Beitrag: 13.09.09, 19:11
  3. [Python] Regex Hilfe
    Von chmee im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 2
    Letzter Beitrag: 07.06.09, 12:27
  4. Hilfe bei Regex (mit preg_replace)
    Von Miraculixx im Forum PHP
    Antworten: 2
    Letzter Beitrag: 22.09.07, 12:27
  5. Hilfe bei Regex...
    Von okieh im Forum Coders Talk
    Antworten: 3
    Letzter Beitrag: 17.05.05, 08:40