RegEx Zeile parsen Medium

watle

Mitglied
Hallo zusammen,
ich versuche eine Methode mit regularen Ausdrücken zu schreiben, aber sie funktioniert nicht.
static Medium readMedium(String line) Liest aus einem einzeiligen String
* ein neues Medium ein und gibt dies zurueck. In diesem String sind jeweils
* durch Komma getrennt folgenden Informationen enthalten: Der erste Eintrag
* gibt stets den Typ des Mediums an, also "CD", "DVD" oder "Buch". Der
* zweite Eintrag gibt stets die Registriernummer an, der dritte den Titel,
* der vierte die Information, ob das Medium ausleihbar ist ("true" oder
* "false"). Bei einem Buch folgen anschlieueend ISBN-Nummer, Autor und
* Mindestalter, bei einer CD oder DVD die Abspieldauer und das
* Mindestalter. Ist der uebergebene String nicht diesen Anforderungen
* entsprechend formattiert oder enthuelt er weitere durch Komma separierte
* Elemente, so ist eine IllegalArgumenException zu werfen. Ein korrekter
* String kann zum Beispiel wie folgt aussehen: Buch,104,Terry
* Schotter,true,ISBN:12345,A. Rollin,12 oder: CD,101,Musik der
* Stille,true,34,6

Java:
public static Medium readMedium(String line) {
        if (line == null) {
            throw new NullPointerException();
        }
Medium res = null;
        String[] temp = line.split(Character.toString(','));
        String rBuch = "(Buch),([0-9]+),([A-Za-z ]+),(true|false),"
                + "([A-Z:0-9]+),([A-Za-z. ]+),([0-9]+)";
        String rMed = "(CD|DVD),([0-9]+),([A-Za-z ]+),(true|false),([0-9]+),"
                + "([0-9]+)";
        if (!Pattern.matches(rBuch, line) || !Pattern.matches(rMed, line)) {
            System.out.println("Here is something wrong. Cant read the file");
        }
        if (Pattern.matches(rBuch, line)) {

            int registernummer = Integer.parseInt(temp[1]);
            int mindestalter = Integer.parseInt(temp[6]);
            boolean ausleihbar = Boolean.getBoolean(temp[3]);
            res = new Buch(registernummer, temp[2], ausleihbar, temp[4],
                    temp[5], mindestalter);
        } else if (Pattern.matches(rMed, line)) {
            int registernummer = Integer.parseInt(temp[1]);
            int mindestalter = Integer.parseInt(temp[5]);
            boolean ausleihbar = Boolean.getBoolean(temp[3]);
            int abspieldauer = Integer.parseInt(temp[4]);
            res = temp[0].equals("CD") ? new CD(registernummer, temp[2],
                    ausleihbar, abspieldauer, mindestalter) : new DVD(
                    registernummer, temp[2], ausleihbar, abspieldauer,
                    mindestalter);
        } else {
            throw new IllegalArgumentException("Invalid Line!!!");
        }
        return res;
    }

public static void main(String[] args) {
        readMedium("Buch,104,TerrySchotter,true,ISBN:12345,A. Rollin,12");
        readMedium("CD,101,Thriller,false,34,6");
}

Danke fuer eure Hilfe:rtfm:
 
Zuletzt bearbeitet:
- du schreibst keine Beispielstrings, mit denen du das ganze testet,

- fange einfacher an, z.B. nur einen String "Buch" und matche das mit "(Buch)" oder was auch immer,
wie weit kommst du erfolgreich, ab welcher Erweiterung geht es nicht mehr?

edit:
"readLine(file f)" als Teil des Titels scheint ohne jede Bedeutung, habe ich geändert
 
Hi SlaterB,

mein RegEx funktioniert nicht.
Java:
String rBuch = "(Buch),([0-9]+),([A-Za-z ]+),(true|false),"
                + "([A-Z:0-9]+),([A-Za-z. ]+),([0-9]+)";

        String rMed = "(CD|DVD),([0-9]+),([A-Za-z ]+),(true|false),([0-9]+),"
                + "([0-9]+)";

        if (!Pattern.matches(rBuch, line) || !Pattern.matches(rMed, line)) {
            throw new IllegalArgumentException("Here is something wrong. Cant read the file");
        }

public static void main(String[] args) {
        readMedium(" Buch,104,Terry Schotter,true,ISBN:12345,A. Rollin,12");
        readMedium("CD, 89,Thriller,true,32,12");
// return only a IAE
}
 
Der Regex für den Titel ist falsch. Ein Titel muss stehen und ich gebe als regular Ausdruck:
Code:
[A-Za-z0-9 ]+

Beispiel für den Titel: Java fuer Anfaenger

Danke für die Weiterhilfe:rtfm:
 
habe gefunden:
Java:
String rBuch = "(Buch),([0-9]+),(([A-Za-z0-9 ]+)*),(true|false),"
                + "((ISBN:)[0-9]+),(([A-Za-z. ]+)*),([0-9]+)";
        String rMed = "(CD|DVD),([0-9]+),(([A-Za-z0-9 ]+)*),(true|false)," +
        		"([0-9]+),([0-9]+)";

Danke🙂
 
ich bekomme aber immernoch folgende Fehlermeldung beim JUnit-Test;🙂noe:
Java:
 [junit] CD,101,EineCD,true,72,6
    [junit] DVD,102,EineDVD,false,94,18
    [junit] Buch,103,Ein Buch,true,ISBN:12345,DerAutor,0
    [junit] Buch,104,Terry Schotter,true,ISBN:12345,A. Rollin,0
    [junit] Buch,105,Der Herr der Dinge,true,ISBN:3456,J. Tollk�hn,12
    [junit] Tests run: 10, Failures: 0, Errors: 1, Time elapsed: 2.932 sec
    [junit] Output:
    [junit] CD,101,EineCD,true,72,6
    [junit] DVD,102,EineDVD,false,94,18
    [junit] Buch,103,Ein Buch,true,ISBN:12345,DerAutor,0
    [junit] Buch,104,Terry Schotter,true,ISBN:12345,A. Rollin,0
    [junit] Buch,105,Der Herr der Dinge,true,ISBN:3456,J. Tollk�hn,12
    [junit] 
    [junit] Tests run: 10, Failures: 0, Errors: 1, Time elapsed: 2.932 sec
    [junit] ------------- Standard Output ---------------
    [junit] CD,101,EineCD,true,72,6
    [junit] DVD,102,EineDVD,false,94,18
    [junit] Buch,103,Ein Buch,true,ISBN:12345,DerAutor,0
    [junit] Buch,104,Terry Schotter,true,ISBN:12345,A. Rollin,0
    [junit] Buch,105,Der Herr der Dinge,true,ISBN:3456,J. Tollk�hn,12
    [junit] ------------- ---------------- ---------------
bitte um hilfe
 
was ist denn deine Frage?
falls man an dem JUnit-Log alles erkennen können sollte - ich kann das nicht,
macht irgendeine bestimmte Zeile Probleme?
kopiere diese in eine normales main-Programm und teste sie, zu welcher hast du eine Frage?

ok, eins ist ja doch an dem Output deutlich: Tollk�hn wird irgendwie komisch geschreiben, dieses Sonderzeichen ist in deinem RegEx sicher nicht abgebildet,
aber was soll jetzt dein 'bitte um hilfe'? das Programm ist hilflos und braucht einen Programmierer als Helfer, bist du aber wirklich nicht schlauer als ein Computer?

schau dir an wo dieser Tolkien herkommt, dein ursprünglicher Thementitel war ja zum Teil "readLine(file f)",
spielt also eine Datei eine Rolle? schau dir an was dort drinsteht, lade die Datei hoch (Anhang an Posting),
poste den Code wie du die Zeilen davon einliest, achtest du da auf Encoding/ CharSet?

nichts davon musst du auf Anhieb lösen, aber du solltest dir zumindest intelligente Gedanken machen
und wenigstens die ganzen Umstände mitteilen die ich mir jetzt selber zusammenreime und mühsam abfragen muss...
 
Zuletzt bearbeitet von einem Moderator:
Sorry SlateB. Habe vergessen erledigt zu markieren.
Ich habe also die Methode durch einen ganz anderen Weg geschrieben. Der Code lautet jetzt:
Java:
public static Medium readMedium(String line) {
        if (line == null) {
            throw new NullPointerException("line == null");
        }
        Medium res = null;
        String[] temp = line.split(Character.toString(','));

        if (temp.length != 7 && temp.length != 6) {
            throw new IllegalArgumentException("line length != 7 or 6");
        }
        int registernummer = 0;
        boolean ausleihbar = false;
        String titel = temp[2];
        if (isValidBCD(temp[0]) || isBooleanValue(temp[3])
                || isValidDigit(temp[1])) {
            registernummer = Integer.parseInt(temp[1]);
            ausleihbar = Boolean.parseBoolean(temp[3]);
        } else {
            throw new IllegalArgumentException("3 erste Strings nicht valid");
        }
        if (temp[0].equals("Buch") && temp.length == 7 && isValidDigit(temp[6])) {
            int mindestalter = Integer.parseInt(temp[6]);
            res = new Buch(registernummer, titel, ausleihbar, temp[4], temp[5],
                    mindestalter);
        } else if ((temp[0].equals("CD") || temp[0].equals("DVD"))
                && temp.length == 6 && isValidDigit(temp[4])
                && isValidDigit(temp[5])) {
            int mindestalter = Integer.parseInt(temp[5]);
            int abspieldauer = Integer.parseInt(temp[4]);
            res = temp[0].equals("CD") ? new CD(registernummer, titel,
                    ausleihbar, abspieldauer, mindestalter) : new DVD(
                    registernummer, titel, ausleihbar, abspieldauer,
                    mindestalter);
        } else {
            throw new IllegalArgumentException("Invalid line");
        }

        return res;
    }

Vielen Dank für Deine Zeit
 

Zurück
Oben