2016-11-17 7 views
0

Der folgende Code gibt nichts aus. Was mache ich falsch? Regexp-Tester myregexp sagt, dass der reguläre Ausdruck korrekt ist.Warum funktioniert meine Regexp nicht?

page = "<div id=\"foo\" class=\"foo\" style=\"background-image: url(foo.jpg); width: 320px; height: 245px\">\n" + 
        " <a href=\"foo\" onclick=\"return bar('foo', 'foo', {foo: bar, foo: bar}, foo)\"></a>\n" + 
        "</div>"; 

Pattern pattern = Pattern.compile("<div.*?</div>"); 
Matcher matcher = pattern.matcher(page); 
while (matcher.find()) { 
    System.out.println(matcher.start() + " " + matcher.end()); 
} 
+1

Verwenden Sie jsoup zum Analysieren von HTML: https://jsoup.org/ –

+8

[HTML nicht mit Regex analysieren] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except -xhtml-in sich abgeschlossene Tags), dies ist NICHT das richtige Werkzeug für den Job. Wie für Ihre Frage, es funktioniert wahrscheinlich nicht, weil es mehrzeilig ist. – alfasin

+0

Danke für den Rat. Ich benutze bereits jsoup, aber meine Eingabe html hat eine falsche Struktur, so dass jsoup auch nicht funktioniert. –

Antwort

1

standardmäßig . in einem regulären Ausdruck nicht Zeilenumbrüche übereinstimmen. Das bedeutet, dass Ihre Regex nicht mit der </div> übereinstimmen kann, weil die neue Zeile, bevor sie nicht übereinstimmt, . ist.

Sie sollten Ihre Kompilierung Linie mit ersetzen:

Pattern pattern = Pattern.compile("<div.*?</div>",Pattern.DOTALL); 

Aber wie wurde in den Kommentaren erwähnt, außer in einfachen Fällen, in denen Sie die Kontrolle über die Struktur des HTML haben (keine Kommentare, kein Javascript, usw.), sollten Sie HTML mit einem HTML-Parser wie JSoup analysieren, ohne eine Regex zu verwenden.

+0

Danke für die einfache Antwort. –

Verwandte Themen