parsen mit regex -> ein schnelles Ende

MiMa

Top Contributor
gestern habe ich mich entschieden mein parsing der ISBN Erkennung nicht mit meiner 2 Jahre alten Methode weiter zu entwicklen. Bei der alten Methode habe ich mittles Strig suche und Manipulation die ISBN ziemlich aufwending mit langen Code und und allen eventualitäten programmiert. Auch musste ich vieles in Abfangen und arbeitet trotzdem nicht alle Dokumente durch.

Nun habe ich eine wesentlich kleinere Methode mit regex geschrieben, die mir auch eleganter und kürzer erscheint. Nach vier Überprüfungen blieb es stehen??
Der Grund dafür war eine richtige (geprüfte) ISBN, die aber nicht in der Datenbak gelistet (e-ISBN) war. Eine entsprechende Abfangungsmethode werde ich implemetieren, aber es gibt in der Datei noch eine weitere ISBN, die wohl in der Datenbank gelistet ist.

Das suchen mit rexeg Pattern und Matcher liefert ein Ergebnis in der Gruppe(0) zurück und teilbereiche in den anderen Gruppe(1-...).
Weis jemand ob es bei dieser Art der Abfrage, Paramter gibt, indem man mehrere Totale Ergebnisse erhält? Oder muss man diese Abfrage in einer Schleife auf den String ausführen lassen um dann mehrere Ergebnisse in einer Liste zu speichern?
Danke
 

VfL_Freak

Top Contributor
Moin,
ich bin mir nicht sehr sicher, ob ich Deine Frage verstehe ... :rolleyes:

Du hast also n ISBNs, die geparst werden sollen, richtig?
Dann solltest Du auch in einer Schleife über diese n Werte laufen und jeden einzeln parsen!

Das suchen mit rexeg Pattern und Matcher liefert ein Ergebnis in der Gruppe(0) zurück und teilbereiche in den anderen Gruppe(1-...).
Weis jemand ob es bei dieser Art der Abfrage, Paramter gibt, indem man mehrere Totale Ergebnisse erhält?
Was genau meinst Du damit ?? :confused:

Gruß Klaus
 

MiMa

Top Contributor
Die Gruppen die ich meine habe ich als Kommentar im Code gekennzeichnet.
Java:
// ISBN: 978-3-8266-8674-0
        // Full match   `978-3-8266-8674-0`
        // Group 1.     `978`   Buchcode
        // Group 2.     `3`     Ländercode
        // Group 3.     `8266`  Verlagscode
        // Group 4.     `8674`  Titelcode
        // Group 5.    `0`     Prüfziffer
        String isbnMuster = "(97+[8-9]{1,1})+[-]+([0-9]{1,5})+[-]+([0-9]{2,7})+[-]+([0-9]{2,4})+[-]+([0-9]{1,1})";

        // Suchmuster für ISBN 10, 13 definieren
        Pattern muster = Pattern.compile(isbnMuster);

        // Wendet das Suchmuster auf den String an
        Matcher gefunden = muster.matcher(textInhalt);

        while (gefunden.find()) {
            log.info("Die gefundene ISBN ist            : " + gefunden.group(0));
            gefundeneIsbn = gefunden.group(0);
//            // Ausgabe der Gruppen von Buchcode bis Prfziffer
//            for (int i = 1; i <= gefunden.groupCount(); i++) {
//                System.out.println("gefundene ISBN Gruppe " + i + " : " + gefunden.group(i));
Die Ausgabe der anderen Gruppen(1-5) interessieren mich derzeit nicht und habe diese deshalb auskommentiert. Das gefundene Muster wird scheinbar nur in Group(0) gespeichert und dann der Suchvorgang beenden?
Da ich mit Regular Expressions kaum Erfahrung habe, würde ich gerne wissen, wie ich "n" weitere ISBN Nummern abfragen kann?
Bevor ich jetzt wieder Monstercode mit vielen Schleifen baue, möchte ich mal nachfragen, ob es in regEx bestimmte Funktionen dafür gibt?
Danke
 

MiMa

Top Contributor
Danke Dir.
Ich hatte auch mit Google einiges gefunden, aber die Monsterzeichenketten funktionierten im Online Regex tester nicht. Noch nicht mal mit den darunter angegebenen Muster, die gefunden werden müssten.
Oder ich bin zu d... dafür. ;)
Mein regex Suchstring sieht jetzt auch wieder anders aus als oben und wird im tester von meinen ISBNs gefunden.
Ich befürchte das,
Java:
 // Wendet das Suchmuster auf den String an
        Matcher gefunden = muster.matcher(textInhalt);
sucht und wenn etwas gefunden wurde ist die suche beendet?
Würde das bedeuten, das diese funktion mehrmals auf den Text angewendet werden muss und die gefundenen Werte in eine arrayList zu speichern, aber keine doppelten, sonst endlosschleife...?
Oder gibt es dafür spezielle Funktionen?

Für diejenigen die auch einsteigen wollen, super erklärt
https://danielfett.de/de/tutorials/tutorial-regulare-ausdrucke/
 
Zuletzt bearbeitet:

MiMa

Top Contributor
Habe zwar gefunden was ich gesucht hatte, jedenfalls ist es mir nicht sofort aufgefallen.
Java:
System.out.println("Die gefundene ISBN ist : " + gefunden.group(0));
ergibt folgende Ausgabe in der Konsole.
Die gefundene ISBN ist : 978-3-540-76393-2
Die gefundene ISBN ist : 978-3-540-76394-9
Die gefundene ISBN ist : 978-3-540-76394-9
Ich komme zu dem Schluss, das doch der gesamte Text durchsucht wird und alle zutreffenden Ergebnisse eingesamtelt werden. Ich vermute mal das in in Group(0) eine Liste mit den Ergebnissen enthalten ist.
Wie kann ich denn dann auf die einzelnen Ergebnisse zugreifen.
Java:
System.out.println("Die gefundene ISBN ist : " + gefunden.group(0).indexOf(0));
Habe dann versucht wie auf einem Array zu zu greifen aber hat nicht geklappt?

https://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html
Dort finde ich auch nicht wie ich auf den ersten, oder den letzten, oder nur auf den Mittleren zugreifen kann?
 
Zuletzt bearbeitet:

VfL_Freak

Top Contributor
aha, und warum postest Du dann die Lösung hier nicht?? :eek:
Ist doch für alle, die ein ähnliches Problem haben, interessant !!

Gruß Klaus
 

MiMa

Top Contributor
Nach langen lesen und probieren, habe ich festgestellt, das man die Ergebnisse aus "gefunden.proup()" nicht abfragen kann, da es KEINE Strings sind. Das hat mich lange Zeit beschäftigt, da ich immer angenommen hatte das Strings als Ergebnisse zurückgegeben werden, da diese so aussahen.
Im Buch habe ich dann nachgelesen, das group() nur eine Liste von Objekten mit Anfangs -und Enpositionen zu den gefundem Muster enthält. Daher kann man weder Stringoperationen noch ArrayList funktionen darauf anwenden.
Java:
System.out.println("Die gefundene ISBN ist : " + gefunden.group(0));
Mit dieser einen Ausgabezeile wird das erste Ergebnis auf den Bildschirm ausgegeben, von der Anfangs -und Endposition, das wars.
Java:
while (gefunden.find()) {
            System.out.println("Die gefundene ISBN ist : " + gefunden.group(0));
}
In der Schleife werden alle Ergebnisse nacheinander ausgegeben solange "gefunden.find()" true zurückmeldet.
Da ich nun keine Strings zum verarbeiten hatte, nahm ich das zurückgegebene Ergebnis und steckte es in eine String Array Liste. Bei jedem durchlauf der Schelife wurde dann das nächste Ergebnis zurückgeliefert, welches ich dann jeweils an sie ArrayListe angehangen habe.
Beim austritt der While Schleife hatte ich dann eine Array Liste mit Strings, die ich dann weiter verarbeiten kann.
Java:
// Schleife der gefundenen Einträge abarbeiten
        while (gefunden.find()) {          
            // prüfen der ISBN Nummer auf Korrektheit
            boolean isbnPruefung = pruefeISBN(gefunden.group());
            if (isbnPruefung == true) {
                // Die ISBN wird der Liste hinzugefügt
                isbnListe.add(gefunden.group());
                System.out.println("Die geprüfte ISBN-Nummer ist korrekt, wurde zur Liste hinzugegügt.");
            } else {
                System.out.println("Die geprüfte ISBN ist nicht korrekt und wurde NICHT hinzugefügt");
            }
}

Damit die Liste dann auch keine doppelten ISBN Nummerns enthält habe ich mir überlegt, vor dem hinzufügen zur Liste noch zu überprüfen ob die Nummer die hinzugefügt werden soll, bereits in der Liste enthalten ist. Wenn nein, dann hinzufügen, ansonsten ignorieren.

Vorher hatte ich regex, Matcher und Patterns noch nicht gearbeitet und kann sagen, das es ziemlich komplex ist und nicht immer das zu sein scheint, wonach es aussieht.
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Nach langen lesen und probieren, habe ich festgestellt, das man die Ergebnisse aus "gefunden.proup()" nicht abfragen kann, da es KEINE Strings sind. Das hat mich lange Zeit beschäftigt, da ich immer angenommen hatte das Strings als Ergebnisse zurückgegeben werden, da diese so aussahen.
Im Buch habe ich dann nachgelesen, das group() nur eine Liste von Objekten mit Anfangs -und Enpositionen zu den gefundem Muster enthält. Daher kann man weder Stringoperationen noch ArrayList funktionen darauf anwenden.
Das klingt ehrlich gesagt sehr verwirrt...ein Blick ins JavaDoc hätte gereicht, um zu sehen das Matcher.group sehr wohl einen String zurück gibt...
 

MiMa

Top Contributor
Vielleicht habe ich mich schlecht ausgedrückt und verwirrt hat es mich auch.
Es werden lediglich Positionsangaben ANFANG bis ENDE aus dem Textinhalt durch das Suchmuster als Ergebnis zurückgegeben. Man kann also schon einen Textinhalt entnehmen indem man dann sagt entnehme mir den Text von ANFANG bis ENDE heraus. Um es nicht so ausführlich machen zu müssen gibt es eine Vereinfachnung und zwar die Rückgabe mit der Methode "group()" diese Methode macht dies und gibt einen String zurück. Aber diese Strings (mehrzahl) konnte ich nach der Ausführung nirgendwo ansprechen ausser in der While Schleife. Ich hatte die Schwierigkeit zu begreifen, da sind Strings, wie spreche ich diese nach der Ausführung an?? Gar nicht. Es muss während der Ausführung sein.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiMa Buch Metadaten aus XML Datei parsen XML & JSON 48
S XML Document Parsen und Ausgeben mit Suchfunktion XML & JSON 21
M parsen von realen HTML-WEB-Seiten XML & JSON 1
K Beim Parsen einer XML-Datei Connection timed out XML & JSON 4
F Parsen von Daten aus einer Homepage XML & JSON 6
G Langsam beim SAX-Parsen - woran liegts? XML & JSON 2
C Parsen des XML-Streams mit SAX XML & JSON 3
M XML Datei Parsen XML & JSON 4
D SAX parsen - Wie? XML & JSON 11
S XML Parsen und Werte zwischenspeichern XML & JSON 2
K Kurze XML Datei Parsen XML & JSON 5
whitenexx Problem beim parsen von Facebook XML XML & JSON 3
J Comments in XML parsen XML & JSON 3
H Nicht wohlgeformtes XML mit SAX parsen XML & JSON 2
M XML Parsen JDOM NullPointerEcxeption XML & JSON 7
Z XML parsen - Element mit Werten XML & JSON 2
ruutaiokwu xml nur bis auf eine bestimmte ebene parsen mit javax.xml... XML & JSON 5
L [SAX] Geschachtelte XML Datei parsen XML & JSON 3
R XML in UTF-8 mit SAX parsen XML & JSON 9
O Parsen einer XML mit JDOM ohne Doctype Declaration XML & JSON 2
F Probleme beim html parsen mit tagsoup XML & JSON 4
M Probleme beim Parsen eines gefilterten XML-Dokuments XML & JSON 6
Semox Kann JUnit XML Parsen? XML & JSON 2
L Reihenfolge beim xml Datei parsen einhalten? XML & JSON 8
L xml Datei parsen ohne End-Tag XML & JSON 6
T RSS-Feed parsen und in Datenbank speichern XML & JSON 6
B XML parsen XML & JSON 3
H XML parsen und unbekannten Namespace zurückgeben XML & JSON 5
L invalide xml document parsen?! XML & JSON 2
S DOM Parsen Problem mit HTML Sonderzeichen XML & JSON 4
ABstraCT XML properties am einfachsten parsen. XML & JSON 2
U xmi parsen über emf XML & JSON 10
S XML-Schema einlesen um parsen zu erleichtern? XML & JSON 2
T Problem beim Parsen von Attribut xmlns="urn:com:test&qu XML & JSON 6
P XMLGregorianCalender parsen XML & JSON 4
M Datei parsen XML & JSON 5
S HTML mit dom4j parsen? XML & JSON 2
X XML File auslesen/parsen u. in ne Hashmap speichern XML & JSON 2
Saxony unbekannte XML Datei parsen und ausgeben XML & JSON 10
P "Formatierungs-Tags" parsen XML & JSON 3
M Attribute parsen XML & JSON 6
R Parsen einer XML ohne Validierung XML & JSON 2
D XML Datei innerhalb einer JAR Datei parsen XML & JSON 2
M Xerces -Parsen mit einer externen Schemadatei geht nicht XML & JSON 2
L bz2-Datei parsen XML & JSON 9
K XML parsen Whitespaces XML & JSON 2
I XML-String mit SAX parsen ? XML & JSON 2
M Object in XML parsen XML & JSON 2
byte Probleme beim Parsen von XHTML-Datei XML & JSON 4
P HTML Seite Parsen, und bestimmten Text extrahieren XML & JSON 3
X xml und xsl parsen mit xerces XML & JSON 8
W Xml-String parsen XML & JSON 2
W root element parsen,Hilfe! XML & JSON 5
F Gibt es Möglichkeiten Deutsche Sätze zu parsen ? XML & JSON 2
A Auf der Suche nach Bibliotheken oder wie parsen? XML & JSON 15
S XML Datei mit Schemafehler parsen XML & JSON 14
R StreamSource parsen ! XML & JSON 8
R RSS parsen XML & JSON 2
K XML Datei parsen XML & JSON 4
E Regex, erste ziffern löschen XML & JSON 4
ruutaiokwu regex auf xml-tags... XML & JSON 3
N RegEx Wertebereich 0 - 255 XML & JSON 3
M Regex XML & JSON 2

Ähnliche Java Themen

Neue Themen


Oben