geloescht_Newlukai Geschrieben 16. Dezember 2007 Teilen Geschrieben 16. Dezember 2007 Hi, ich habe die Aufgabe erhalten, eine HTML-Datei nach Informationen der enthaltenen Links abzugrasen. Es soll vereinfachend angenommen werden, daß ein Link nicht über mehrere Zeilen verteilt sei. Es sollen das href-Attribut, also die Zieladresse, sowie der im Tag enthaltene Text ausgegeben werden. Die Aufgabe möchte ich als Gelegenheit wahrnehmen, mich ein wenig mit den regulären Ausdrücken zu befassen. Ich bin auch schon kurz vorm Ziel, aber nun verlassen mich die Kenntnisse über reguläre Ausdrücke. Langer Rede kurzer Sinn. Hier stehe ich (Java-RegEx): <a\\s+[^<>]*href=\\\"([^<>\\\"]*)\\\"[^<>]*>([^<>]*)</a> Das ist mein bisher entwickeltes Pattern. Kurzer Überblick: <a // Klar, nach einem a-Tag suchen \\s+ // Danach muß mindestens ein Whitespace folgen [^<>]* // Dann ein Haufen beliebiger Zeichen. Bis auf < oder > href=\\\" // Irgendwann kommt auch ein href-Attribut vor ([^<>\\\"]*) // Mit einem Inhalt. Allerdings ohne <, > oder " \\\" // Dann endet das href-Attribut [^<>]* // Und danach kann noch einiges stehen. Wieder ohne < oder > > // Der Start-Tag endet ([^<>]*) // Es folgt ein Inhalt, auch der muß ohne < oder > daherkommen </a> // Und der Link ist fertig Ich dachte mir das so, daß ich mittels Capturing Groups dann nur noch die Gruppen für jeden Fund durchgehe und ausgebe (bis auf Gruppe 0). Das funktioniert auch - fast. Je nachdem wie ich die runden Klammern der Capturing Groups setze, bekomme ich kein Ergebnis bis hin zu 3 Gruppen. Bei den 3 Gruppen enthält dann Gruppe 0 den ganzen Tag (vom "<a" bis zum "</a>"), Gruppe 1 auch und Gruppe 2 den Inhalt des href-Attributs. Ich habe versucht, mir das Prinzip der Capturing Groups anzulesen, aber irgendwie komme ich nicht ganz dahinter, wie der Parser dabei vorgeht. Es erschließt sich mir noch nicht. Ich hoffe, daß hier da jemand nachhelfen kann. Hier ein paar Beispiele: Pattern: (<a\\s+[^<>]*href=\\\"([^<>\\\"]*)\\\"[^<>]*>([^<>]*)</a>) Input: <a href="blubb">bla</a> Output: Group 0: <a href="blubb">bla</a> Group 1: <a href="blubb">bla</a> Group 2: blubb Pattern: <a\\s+[^<>]*href=\\\"([^<>\\\"]*)\\\"[^<>]*>([^<>]*)</a> Input: <a href="blubb">bla</a> Output: Group 0: <a href="blubb">bla</a> Group 1: blubb Pattern: <a\\s+[^<>]*href=\\\"[^<>\\\"]*\\\"[^<>]*>([^<>]*)</a> Input: <a href="blubb">bla</a> Output: Group 0: <a href="blubb">bla</a> Pattern: <a\\s+[^<>]*href=\\\"([^<>\\\"]*)\\\"[^<>]*>[^<>]*</a> Input: <a href="blubb">bla</a> Output: Group 0: <a href="blubb">bla</a> Pattern: <a\\s+[^<>]*href=\\\"[^<>\\\"]*\\\"[^<>]*>[^<>]*</a> Input: <a href="blubb">bla</a> Output: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 16. Dezember 2007 Teilen Geschrieben 16. Dezember 2007 Hallo, müssen es zwingend RegExpres sein? Ich würde das mit Hilfe von XSLT lösen, Du filterst nur das href-Attribut raus und verarbeitest es weiter z.B. CSV Daten o.ä. HTH Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_Newlukai Geschrieben 16. Dezember 2007 Autor Teilen Geschrieben 16. Dezember 2007 Das ganze ist im Rahmen einer Übung meiner Vorlesung zu bearbeiten. RegEx wurden angesprochen und die Übung dient eigentlich zum Anwenden der verschiedenen String-Methoden wie charAt() oder substring(). Ich wollte es aber etwas eleganter machen. Am liebsten wäre mir ein Zustandsautomat oder so gewesen, aber in der Kürze der Zeit zu viel. Und XSLT wäre auch too much. Bin aber auf etwas gestoßen. Das hier hilft: <a\\s+[^>]*href=\\\"([^\\\"]*)\\\"[^>]*>((.*(?=</a>)))</a> Die Quantifizierer und das alles sind mir klar. Nur die Capturing groups noch nicht. Warum muß der Link-Text doppelt gruppiert werden? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_Newlukai Geschrieben 17. Dezember 2007 Autor Teilen Geschrieben 17. Dezember 2007 Der Link-Text muß nicht doppelt gruppiert werden. Man sollte nur auf den Zähler in der Schleife achten, der über die Gruppen latscht. :floet: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.