Regex über mehrere Zeilen Java

Schattenfänger

Lt. Junior Grade
Registriert
Nov. 2010
Beiträge
273
Hey ich habe jetzt zwar schon länger gesucht aber nichts gefunden.
Also ich benötige für ein File einen Regex, bzw einige um an ein paar Daten zu kommen.

zB:
PHP:
        <option  class=""
                                          value="val"
                                          fbUrl=""
                                          cookieName=""                                         
                                          >


               name3
        </option>

            
        <option  class=""
                                          value="val"
                                          fbUrl=""
                                          cookieName=""                                         
                                          >


               name2
        </option>

            
        <option  class=""
                                          value="val"
                                          fbUrl=""
                                          cookieName=""                                         
                                          >


               name1
        </option>

Wie ich die Werte von val erhalte ist klar, nur wie komme ich auf den name ?

Habe dieses pattern: (\w*)\s*\w*\n\s*</option
damit matcht er mir vom Zeilenanfang von name bis option http://regexpal.com/
Nur funktioniert dies nicht in Java.
Pattern.compile("(\\w*)\\s*[.*]</option",Pattern.MULTILINE)
Versucht habe ich noch Pattern.Dotall, aber das bringt auch nix, kann mir da jemand weiterhelfen?

Desweiteren gibt es noch das Problem, dass eine suche mit meinem Pattern wirklich sehr allgemein ist und es noch andere Forms gibt, welche nicht benötigt werden, deshalb hatte ich zuvor "von oben nach unten" gematcht aber da dies auch nicht ging....

Gibt es sonst eine vorhandene Java Lib die das schon alles machen kann?
Gefunden habe ich JSoup, ist diese ansonsten zu empfehlen?
(Aber generell möchte ich es möglichst ohne externe Jars machen)
 
Kannst du bitte etwas genauer beschreiben, welche Informationen du aus der Datei genau extrahieren möchtest? Denn das ist mir nicht klar.

Du schreibst du weißt, wie du die Werte von "val"" erhältst. "val" ist allerdings nach dem Beispiel selbst ein Attributswert, oder meintest du "value"?

Dann schreibst du, dass du an den "name" kommen willst. Meinst du du die Werte der Attribute "cookieName"? Oder willst du den Text zwischen den Tags also "name1", "name2" und "name3" haben?
 
Ich will im Endeffekt den innerHtml haben.
Also das was zwischen <option> und </option> sichtbar steht.
Hier im Beispiel, name1, name2, name3.
 
Ok, alles klar.

Zunächst einmal solltest du nicht die von dir genannte Testseite verwenden, da diese RegExp für JavaScript testet. Benutz lieber etwas, was wirklich Java ist, z.B.: http://myregexp.com/

Nun zur Lösung:

Hier die Variante, welche den Whitespace nicht mit erkennt:
Code:
    String dateiInhalt = .......;
    Pattern pattern = Pattern.compile(".*?<option.*?>\\s*(.*?)\\s*</option>.*?", Pattern.DOTALL);
    Matcher matcher = pattern.matcher(dateiInhalt);
    while(matcher.find())
    {
      System.out.println("Ohne Whitespace: " +  matcher.group(1));
    }

Hier die Variante, welche den Whitespace erhält:
Code:
    String dateiInhalt = .......;
    Pattern pattern = Pattern.compile(".*?<option.*?>(.*?)</option>.*?", Pattern.DOTALL);
    Matcher matcher = pattern.matcher(dateiInhalt);
    while(matcher.find())
    {
      System.out.println("Mit Whitespace: " +  matcher.group(1));
    }
 
Bähh ist das fies.
Ich habe es die ganze zeit versucht die attribute des tags auch noch miteinzubeziehen, dass es ja innerhalb der beiden tags steht habe ich gar nicht bedacht :mad:

Das Problem ist nur, dass es eben auch forms gibt von welchen ich keine Informationen will.

Und die werden mit deiner Lösung auch gematcht.
sprich:

<option class="" id="">
picturezeugs
</option>

die bekomme ich auch bei meiner Ergebnissmenge, was ich aber nicht will :)
Und namen bzw classes wurden keinen options zugewiesen, wodurch ich die Unterscheidung im Endeffekt nur mit den values machen kann.
 
Da die Datei die du auslesen möchtest offenbar XML ist, verstehe ich nicht, warum du nicht einfach einen XML-Parser verwendest. Das wäre deutlich einfacher (und schneller!), als eine XML-Datei über Pattern-Matching auszulesen.
 
Sein HTML ist zwar nicht zwingend XML, jedoch hat das Document Object Model auch ein HTML-Interface. Das wäre bis auf wenige Ausnahmen (HTML stark kaputt) zweifelsfrei die beste Option, das Problem anzugehen, da es extra dafür gemacht wurde (statt reguläre Ausdrücke auf eine nicht reguläre Sprache anzuwenden).

http://www.w3schools.com/htmldom/default.asp

edit:

Falls es sich bei seinem Auszug oben überhaupt um HTML handelt. Sollte es sich um eine XML-Sprache handeln, so ist die Sache eh klar und Regex die schlechteste aller Optionen.
 
Zuletzt bearbeitet:
sash2k2 schrieb:
Da die Datei die du auslesen möchtest offenbar XML ist, verstehe ich nicht, warum du nicht einfach einen XML-Parser verwendest. Das wäre deutlich einfacher (und schneller!), als eine XML-Datei über Pattern-Matching auszulesen.

Ne kein XML aber HTML, aber läuft ja auf das gleiche raus.

@carom
Okay, habe ich mir schon fast gedacht, danke sehr.
Werde dann mal JSoup ausprobieren und regex um mögliche Strings zu zerlegen.
 
Ohne irgendwas wirklich gelesen zu haben nimm einfach Jsoup oder vergleichbares und geh mit z.B.: CSS selector language drauf.
Alternative geht auch xpath glaub aber jsoup selbst kann kein xpath. Gibt aber sicher vergleichbares.
 
Zurück
Oben