ich möchte aus einer HTML-Datei Werte mittels Regex auslesen. Das Problem sind glaub ich die Zeilenumbrüche und Leerzeichen bei mir. Kann mir da jemand helfen und einen passenden Ausdruck formulieren? Das HTML sieht wie folgt aus:
... und so weiter...
Ich möchte mir dynamisch in der Anwendung einen Ausdruck zusammen bauen und mir explizit je nach Bedarf den Namen oder auch das Datum nach "Dabei seit:" auslesen. Wäre echt klasse, wenn mir jemand sagen kann, wie dieser Ausdruck aussehen muss...
Umm, mit RegEx auf anderer Leute HTML loszugehen ist immer etwas heikel, da man sich leider nie sicher sein kann das
a) der HTMLcode auch wohlgeformt ist (bzw. so wie man ihn haben möchte) und
b) das sich der HTMLcode nie ändert (was zur Folge haben kann das der RegEx was falsches matched, wenn überhaupt irgendwas)
Daher würde ich eher dazu raten XPath statt RegEx zu nutzen. Dann muss man sich nicht mehr um Leerzeichen oder Zeilenumbrüche kümmern, und übersichtlicher ist es auch. HtmlCleaner wäre zum Beispiel eine passende Library. Da steckst du ein HTML Dokument rein, lässt einen DOM-Tree generieren, und kannst anschließend mit XPath darin "herumlaufen". In etwa so:
Java:
String name = htmlRootnode.evaluateXPath("//dd[1]").getText();String datum = htmlRootnode.evaluateXPath("//dd[2]").getText();
Genau. Aber da referenzierst du einfach auf [c]//dd[1][/c] und nicht auf [c]"Name:"[/c]. Wie würde bei dir eine Methode [c]getResult(String input, String key)[/c] aussehen?
Keine Ahnung. So gut kenne ich mich damit auch nicht aus. Wenn man ansonsten gar nichts über die Umgebung weiss in welcher der Key auftaucht, dann könnte man halt alle dt-Tags des Dokuments durchlaufen bis man den denjenigen mit dem gewünschten Key findet. Und der gesuchte String befindet sich dann halt in dem darauf folgenden dd-Tag.
In der Praxis findet man in HTMLseiten, die man sich aus dem Netz fischt, aber jede Menge Anhaltspunkte, die einem bei der Suche helfen. So eine Seite in dreckigem Strassen-HTML schaut erfahrungsgemaess eher so aus:
Da wird es (für XPath) freilich sehr leicht, sich z.B. an den Class-Namen zu orientieren um die gewünschten Informationen zu finden. Soetwas jedoch korrekt mit RegEx behandeln zu wollen wird für mein Empfinden deutlich unübersichtlicher. Und selbst im Fall, das der vom TE gepostete Dokumentenschnipsel tatsächlich das gesamte Dokument darstellt, das er jemals parsen möchte, finde ich XPath noch ästhetischer als RegExp.
Kann ich das dann alles mit einem einzigen Ausdruck abwickeln? Oder benötige ich seperate reguläre Ausdrücke? Wenn ja, wie würden die anderen beiden Fälle aussehen?
Auch wenn ich mich wiederhole - ich würde mir das mit RegEx nicht antun. Investiere lieber 2 Stunden um dich in XPath einzulesen. Dann kannst du dir leicht alle Dokumentknoten des Typs <dt> herausfischen lassen, überprüfen ob da der richtige Text drinsteht, und dir dann ggf. den folgenden <dd>-Knoten ausgeben lassen. Geht zwar nicht in einer Zeile, ist aber simpel, lesbar und wartbar.
Nur der Vollständigkeit habler:
Es gibt auch Pattern.compile(String, int) Damit können dem Pattern bestimmte Flags übergeben werden, z.B. DOTALL um Zeilenumbrüche auch mit
Code:
.
zu matchen. Damit spart man sich auch das \s oder \s*.
Kann ich das dann alles mit einem einzigen Ausdruck abwickeln? Oder benötige ich seperate reguläre Ausdrücke? Wenn ja, wie würden die anderen beiden Fälle aussehen?