4 Stimmen

Regex in Java Frage, mehrere Treffer

Ich versuche, mehrere CSS-Stilcodeblöcke in einem HTML-Dokument anzupassen. Dieser Code passt zum ersten, aber nicht zum zweiten. Welchen Code bräuchte ich, um den zweiten anzupassen? Kann ich einfach eine Liste der Gruppen bekommen, die sich innerhalb meiner 'style'-Klammern befinden? Sollte ich die 'find'-Methode aufrufen, um das nächste Match zu erhalten?

Hier ist mein Regex-Muster

^.*()(.*)().*$

Verwendung:

final Pattern pattern_css = Pattern.compile(css_pattern_buf.toString(), 
                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);

 final Matcher match_css = pattern_css.matcher(text);
        if (match_css.matches() && (match_css.groupCount() >= 3)) {
            System.out.println("Woot ==>" + match_css.groupCount());
            System.out.println(match_css.group(2));
        } else {
            System.out.println("Kein Treffer");
        }

14voto

bobince Punkte 512550

Ich versuche, mehrere CSS-Style-Codeblöcke in einem HTML-Dokument abzugleichen.

Standardantwort: Verwenden Sie kein Regex zum Parsen von HTML. Regex kann HTML nicht zuverlässig parsen, egal wie kompliziert und ausgeklügelt Sie Ihren Ausdruck machen. Wenn Sie nicht absolut sicher sind, dass das genaue Format des Ziel-Dokuments völlig festgelegt ist, ist die Verarbeitung von Zeichenketten oder Regex unzureichend und Sie müssen einen HTML-Parser verwenden.

()(.*)()

Das ist ein gieriger Ausdruck. Das (.*) in der Mitte wird so viel wie möglich übereinstimmen. Wenn Sie zwei Style-Blöcke haben:

1 2

wird es fröhlich '1 2' übereinstimmen.</p> <p>Verwenden Sie (.*?) für einen nicht-gierigen Ausdruck, der dem abschließenden () ermöglicht, so früh wie möglich übereinzustimmen.

Sollte ich die Methode 'find' aufrufen, um die nächste Übereinstimmung zu erhalten?

Ja, und Sie hätten sie auch verwenden müssen, um die erste Übereinstimmung zu erhalten. Die übliche Redewendung ist:

while (matcher.find()) {
    s= matcher.group(n);
}

Beachten Sie, dass die Standard-Zeichenkettenverarbeitung (indexOf usw.) für Sie möglicherweise ein einfacherer Ansatz ist als Regex, da Sie nur vollständig feste Zeichenketten verwenden. Die Standardantwort gilt jedoch weiterhin.

0 Stimmen

Danke, ich war auch nicht über matcher.find() im Bilde. Aber ich brauche Regexes in Java auch nicht oft :)

0voto

Gumbo Punkte 617646

Sie können das Regex wie folgt vereinfachen:

()(.*?)()

Und wenn Sie die Gruppen 1 und 3 nicht benötigen (wahrscheinlich nicht), würde ich die Klammern entfernen und nur noch Folgendes übrig bleiben:

(.*?)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X