Mit RegEx große Dokumente erfassen

Status
Nicht offen für weitere Antworten.
A

anon

Gast
Hallo,

ich habe folgendes HTML-Dokument:
Code:
<dt>
<b class="sstime">5.30-9.00[/b]&<span class="cname">Das Erste</span>
</dt>

<dd>
[url="./fernsehen/sendung.html?cid=Ard&stime=2009-02-10%2005%3a30%3a00%2b01"]ZDF-Morgenmagazin[/url]
<i class="sktext">Vom Duett zum Duell: Merkel gegen Seehofer?

Europäischer Sicherheitskongress: Wie bedroht ist Deutschland?

Starkes Sicherheitsbedürfnis: Zulauf für Rechts bei Wahlen in Israel

Kritik am EU-Abkommen: Klagen gegen Verträge von Lissabon vor dem BVerfG

Adieu Schiefertafel: Bildungsmesse didacta setzt auf "White Board"

Berlinale

Sport: WM-Abfahrt Ski alpin: Endlich Medaille für Maria Riesch?

"Gestatten, Bundestrainer": Michael Kuhn, Trampolin[/i]
</dd>

....

<dt>
<b class="sstime">5.30-9.00[/b]&<span class="cname">ZDF</span>
</dt>

<dd>
[url="./fernsehen/sendung.html?cid=Zdf&stime=2009-02-10%2005%3a30%3a00%2b01"]ZDF-Morgenmagazin[/url]
<i class="sktext">Vom Duett zum Duell: Merkel gegen Seehofer?

Europäischer Sicherheitskongress: Wie bedroht ist Deutschland?

Starkes Sicherheitsbedürfnis: Zulauf für Rechts bei Wahlen in Israel

Kritik am EU-Abkommen: Klagen gegen Verträge von Lissabon vor dem BVerfG

Adieu Schiefertafel: Bildungsmesse didacta setzt auf "White Board"

Berlinale

Sport: WM-Abfahrt Ski alpin: Endlich Medaille für Maria Riesch?

"Gestatten, Bundestrainer": Michael Kuhn, Trampolin[/i]
</dd>

....

<dt>
<b class="sstime">5.30-10.00[/b]&<span class="cname">SAT.1</span>
</dt>

<dd>
[url="./fernsehen/sendung.html?cid=Sat1&stime=2009-02-10%2005%3a30%3a00%2b01"]Frühstücksfernsehen[/url]
</dd>
<hr>
<dt>
<b class="sstime">5.30-6.00[/b]&<span class="cname">DSF</span>
</dt>

<dd>
Sport Clips
</dd>

....

Wie kann ich mit RegEx nun zwischen "dt" und "dd" auslesen? Folgender Code funktioniert nicht:
Code:
    String input = all.toString();
	   
	    Pattern p = Pattern.compile("<dd[^>].*>(.*)</dd>");
	    Matcher m = p.matcher(input);

	    while ( m.find() ) {
	    	System.out.println(input.substring(m.start(), m.end()));
	    	System.out.println("***");
	    }

Vielen Dank vorab,
anon
 

Marco13

Top Contributor
Bei Großen Dokumenten ist RegEx u.U. ziemlich lahm. (Unter BESTIMMTEN Umständen kann das Matching sogar exponentielle Zeit bzgl. der Eingabegröße benötigen). Den Ansatz, einfach mit
s.indexOf("bla", n)
die gewünschten Stellen rauszupicken, solltest du zumindest in Erwägung gezogen haben...
 

Ebenius

Top Contributor
Marco13 hat gesagt.:
Bei Großen Dokumenten ist RegEx u.U. ziemlich lahm. (Unter BESTIMMTEN Umständen kann das Matching sogar exponentielle Zeit bzgl. der Eingabegröße benötigen). Den Ansatz, einfach mit
s.indexOf("bla", n)
die gewünschten Stellen rauszupicken, solltest du zumindest in Erwägung gezogen haben...
Stimmt, das sollte aber bei HTML-Dateien in aller Regel nichts ausmachen. Hier ist einfach der reguläre Ausdruck falsch. Um den zu korrigieren würde die Liste der gewünschten Treffer bzgl. des obigen Beispiels sehr helfen.

Ebenius
 
K

Kaffeemaschinist

Gast
Bei der Regenechse ist der erste Punkt zuviel, versuch mal
Code:
<dd[^>]*>(.*)</dd>

Mit dem Punkt würde folgendes passieren: Suche nach einer Zeichenkette, die mit <dd beginnt, der kein direkt < folgt. Damit würdest du schon mal <dd> nicht finden.

Dann noch die Regenechse auf nicht gierig einstellen (könnte sein, dass die von vornherein "greedy" sucht).


Nachtrag:
Guck mal in die JavaDoc unter Pattern nach, dort findest du noch folgendes:
The regular expression . matches any character except a line terminator unless the DOTALL flag is specified.

Du musst also unbedingt deinen Pattern mit dieser DOTALL-Option schalten, sonst beißt er sich an den Newlines die Zähne aus.
 

Ebenius

Top Contributor
Hm. Also meiner Meinung nach wird das selbst mit Backmatches nix. Nimm doch einen fertigen HTML-Parser dafür, das führt zu mehr... Zum Beispiel den hier.

Ebenius
 
K

Kaffeemaschinist

Gast
RegexCoach runterladen, Testdaten und Statement eingeben und auf Go drücken.

Tadaaaaaaa... funzt.
 

Ebenius

Top Contributor
Mit dem Ausdruck den Du oben gepostet hast, bekommst Du nur einen einzigen großen Treffer. Das geht natürlich mit RegExps. Ich gehe aber davon aus, dass der ThreadOpener jeden der <dd>...</dd> und <dt>...</dt>-Bereiche einzeln haben möchte. Mit welchem Ausdruck klappt das dann? Ich bin gespannt. :)

Ebenius
 

Illuvatar

Top Contributor
Kaffeemaschinist hat gesagt.:
Bei der Regenechse ist der erste Punkt zuviel, versuch mal
Code:
<dd[^>]*>(.*)</dd>

Das einfachste, um das nicht-gierig zu machen, wäre folgende Regex:
Code:
<dd[^>]*>(.*?)</dd>

Und nebenbei gesagt, wird so auch das Konstrukt in der ersten spitzen Klammer überflüssig =>
Code:
<dd.*?>(.*?)</dd>
sollte funktionieren.

Und es stimmt, falls du mehrzeilige Sachen matchen willst musst du laut API Pattern.DOTALL aktivieren. Ich bin grad nur etwas verwirrt, weil ich meine auch schon mehrzeilige Sachen gematched zu haben, ohne diesen Parameter auch nur zu kennen...
 
K

Kaffeemaschinist

Gast
Geht nich gibt's nich!

Mit Illuvators Vorschlag sieht's in etwa so aus:

Code:
Pattern p = Pattern.compile("<dd.*?>((.*?))</dd>",Pattern.DOTALL);
        Matcher m = p.matcher("dein<dd class=\"brimbramborum\">Text[b]als[/b]String</dd>");
        
        while (m.find()) {
        	
        	System.out.println("Gefunden von Position "+m.regionStart()+" bis "+m.regionEnd()
        			+ " mit den Gruppen");
        	for (int i=0; i<m.groupCount();i++) {
        		System.out.println(i+": "+m.group(i));
        	}
        }

Ich weiß nur grad nicht, warum ich doppelte Klammerung nehmen musste, damit er die Gruppe Nr. 1 findet. Sollte nicht so sein. Im Zweifelsfall mal nur eine Klammerung setzen :-/
 

Ebenius

Top Contributor
Dann nehme ich alles zurück was ich behauptet habe. :lol: Also lautet der komplette benötigte Ausdruck:
Code:
(?ms:<((?:dd)|(?:dt)).*?>(.*?)</\1>)
Und dann die Capturing Group $2 nehmen.

Ebenius
 
K

Kaffeemaschinist

Gast
Schon richtig, aber Gruppe 0 ist immer der komplette Ausdruck, in meinem Beispiel also <dd class=\"brimbramborum\">TextalsString</dd>

Trotzdem sollte mit einfacher Klammerung bei Group 1 dastehen:
TextalsString. Tut's sondersamerweise nicht, bin ich grad betrottelt?
 

Ebenius

Top Contributor
Kaffeemaschinist hat gesagt.:
Schon richtig, aber Gruppe 0 ist immer der komplette Ausdruck, in meinem Beispiel also <dd class=\"brimbramborum\">TextalsString</dd>
Stimmt.

Kaffeemaschinist hat gesagt.:
Trotzdem sollte mit einfacher Klammerung bei Group 1 dastehen:
TextalsString.
Stimmt.

Kaffeemaschinist hat gesagt.:
Tut's sondersamerweise nicht, bin ich grad betrottelt?
Das liegt nur daran, dass "m.groupCount()" Dir bei einfacher Klammerung in Zeile 9 eine 1 zurück gibt und damit die Zeile 10 nur einmal aufgerufen wird mit "m.group(0)". Klar? Also schreib in Zeile 10 ein "i + 1" und es funktioniert mit einfacher Klammerung, wirst sehen.

Ebenius
 
K

Kaffeemaschinist

Gast
Ei, hast recht: Group zero [..] is not included in this count.

Danke für die Klarstellung! :)

Irgendwie trotzdem kein schöner Stil für Leute, die es gewohnt sind, dass Schleifen bei 0 beginnen und nicht bei 1.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Große Datei mit Regex durchsuchen Allgemeine Java-Themen 4
H Frage regex greater than less than Allgemeine Java-Themen 7
N Regex schlägt nicht an Allgemeine Java-Themen 10
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
T regex case insensitive trimmed Allgemeine Java-Themen 6
S Zeichen | in regex Allgemeine Java-Themen 8
X Regex mit mehreren Bedingungen machen Allgemeine Java-Themen 5
N Hilfe bei RegEx benötigt Allgemeine Java-Themen 3
C Java17 und Regex Allgemeine Java-Themen 13
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N E-Mail Validator (ohne Regex!) Allgemeine Java-Themen 7
OnDemand Regex von bis Allgemeine Java-Themen 6
W Versionsnummer auslesen - Regex ist zickig Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
G Regex Allgemeine Java-Themen 2
L regex ganzer string? Allgemeine Java-Themen 2
MiMa Geldbetrag mit regex ermitteln. Allgemeine Java-Themen 14
W RegEx Stringliteral finden - Jflex Allgemeine Java-Themen 5
D Regex Probleme Allgemeine Java-Themen 2
Kirby.exe Regex charakter ignorieren Allgemeine Java-Themen 12
S Java SAT (Haltbarkeitsproblem) mit Regex Allgemeine Java-Themen 6
S [Regex] Nur diese Zeichen beachten Allgemeine Java-Themen 1
M Bitte Hilfe mit REGEX (Negieren) Allgemeine Java-Themen 4
J Compilerfehler bis in java.util.regex.Pattern... Allgemeine Java-Themen 2
C PDFBox: Nach RegEx ganze Zeile Allgemeine Java-Themen 4
S Regex mit UND-Verknüpfung Allgemeine Java-Themen 1
P RegEx für Zeiten Allgemeine Java-Themen 7
D Regex: Komplettes Wort bekommen Allgemeine Java-Themen 3
Neumi5694 Operatoren regEx für das Erstellen eines Strings verwenden Allgemeine Java-Themen 3
P RegEx Allgemeine Java-Themen 3
W String Parsen und auf eigenes Muster anwenden (kein Regex) Allgemeine Java-Themen 11
Y regex | n-faches Vorkommen oder gar keins Allgemeine Java-Themen 6
turmaline Regex gegen Regex prüfen Allgemeine Java-Themen 4
HarleyDavidson Regex - Optimierung Allgemeine Java-Themen 4
M Regex für Zahleneingabe in JavaFX Textfield Allgemeine Java-Themen 18
T Best Practice Wortregeln RegEx Allgemeine Java-Themen 11
A ALTER TABLE mit Hilfe von RegEx zerlegen, splitten Allgemeine Java-Themen 5
H Interpreter-Fehler Regex kompiliert nicht Allgemeine Java-Themen 5
M RegEx alle Matches ausgeben Allgemeine Java-Themen 5
Iron Monkey Mit Regex nach Beträge suchen Allgemeine Java-Themen 4
T REGEX Erklaerung Allgemeine Java-Themen 14
T Nur innerhalb des regex-Match ersetzen Allgemeine Java-Themen 9
H Pic Download / Regex Problem Allgemeine Java-Themen 7
F Frage zu Regex möglich Allgemeine Java-Themen 4
M Regex... mal wieder Allgemeine Java-Themen 3
H RegEx - Ersetze alles bis Leerzeichen Allgemeine Java-Themen 5
S regex verbrät CPU Allgemeine Java-Themen 6
V Regex Bereichs Filter Allgemeine Java-Themen 4
127.0.0.1 RegEx _ und 0-9 Allgemeine Java-Themen 45
S Entfernen von allen Nicht-Buchstaben chars aus einem String ohne Regex..? Allgemeine Java-Themen 10
P Java String Regex Allgemeine Java-Themen 2
AyKay Regex XPath Allgemeine Java-Themen 4
C Regex (Case insensitive und Umlaute) Allgemeine Java-Themen 4
D Regex Raute erkennen Allgemeine Java-Themen 2
nrg Zweistelligen Zahlenbereich mit RegEx Allgemeine Java-Themen 8
GilbertGrape Regex-Problem Allgemeine Java-Themen 2
W Denkblockade RegEx Allgemeine Java-Themen 2
S eigene regEx schreiben Allgemeine Java-Themen 4
C Regex expandieren Allgemeine Java-Themen 6
C Regex Überschniedung von Ausdrücken Allgemeine Java-Themen 16
reibi RegEX - Teilstring Allgemeine Java-Themen 6
R Java-RegEx terminiert nicht Allgemeine Java-Themen 3
M Regex: Ich stehe auf dem Schlauch Allgemeine Java-Themen 2
V Kleines Regex-Problem Allgemeine Java-Themen 3
B Regex "Problem" Allgemeine Java-Themen 4
B RegEx: (Um-)formulieren eines Pattern zur Identifizierung komplexer URLs Allgemeine Java-Themen 7
P RegEx mit HTML Parser für Java möglich? Allgemeine Java-Themen 10
J Regex: Fertige URLS aus Javascript Allgemeine Java-Themen 3
N Java regex Allgemeine Java-Themen 5
K Regex JSON Allgemeine Java-Themen 3
J RegEx Ausdruck Allgemeine Java-Themen 2
J Regex: URLS aus CSS Allgemeine Java-Themen 2
G RegEx- Ausdruck Allgemeine Java-Themen 4
G RegEx kein Unterstrich Allgemeine Java-Themen 2
A Text via RegEx durchsuchen und teile ersetzten Allgemeine Java-Themen 5
C Regex: Zahl ohne führende Null Allgemeine Java-Themen 13
W RegEx Zeile parsen Medium Allgemeine Java-Themen 8
X Java String Regex - Sonderzeichen Filtern Allgemeine Java-Themen 5
S Dateiname mit Regex parsen Allgemeine Java-Themen 3
Loyd Noch ne Regex-Frage: Verschachtelte Ausdrücke Allgemeine Java-Themen 4
R Java Regex Frage Allgemeine Java-Themen 17
Daniel_L RegEx-Frage: Ersetzen in UBB ausschließen Allgemeine Java-Themen 2
S regex für einen Link Allgemeine Java-Themen 3
E Regex alles nach ? löschen Allgemeine Java-Themen 4
M RegEx-Frage Allgemeine Java-Themen 2
R Regex Tokenizer Allgemeine Java-Themen 11
E Regex HTML Tag und Inhalt löschen Allgemeine Java-Themen 4
H RegEX und eMail Allgemeine Java-Themen 4
L-ectron-X Regex zum Entfernen von mehrzeiligen Kommentaren Allgemeine Java-Themen 2
martin82 Regex - JTable - Filter Allgemeine Java-Themen 10
nrg Kleine Hilfe mit RegEx Allgemeine Java-Themen 2
B Regex-Fehler nach lib-Update Allgemeine Java-Themen 2
K Contrains oder Regex Allgemeine Java-Themen 3
J replaceAll , "[", "]" & regex Allgemeine Java-Themen 12
P RegEx und $-Zeichen als Literal Allgemeine Java-Themen 5
P RegEx - Worte ausschließen Allgemeine Java-Themen 8
S Regex - was isst denn {javaLetter} und {javaDigit}? Allgemeine Java-Themen 2
D Wie werden Regex-Gruppen kompiliert? Allgemeine Java-Themen 2
Stillmatic RegEx Matches ausgeben Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben