2017-03-12 9 views
0

ich eine einfache regex zu machen versuchen, aber ich einige Schwierigkeiten mit etwas mit „*.“:Regex, stoppt passende

Lassen Sie sich den folgenden Text vor:

<div class="thread">things</p></div><div class="thread">things</p></div> 
<div class="thread">things</p></div> 

Ich mag passen alle things. Zu wissen, dass things buchstäblich alles sein kann.

Also, zuerst begann ich mit diesem Regex: /<div class\=\"thread\">(.*)<\/p><\/div>/ und ich fügte einen Modifikator hinzu, um die zweite Linie auch zu entsprechen.

Problem ist, diese Regex gibt nur ein Spiel:

things</p></div><div class="thread">things</p></div> 
<div class="thread">things 

Weil es bei der ersten <div class="thread"> beginnt und endet an der letzten </p></div>

Wie konnte ich die Regex anweisen zu stoppen passende .* nach die erste </p></div>?

+0

Sie sollten einen DOM-Parser verwenden, wenn Sie erwarten, dass Sie etwas Komplizierteres als dieses finden müssen. –

+0

Ich habe versucht, einen DOM-Parser zu verwenden, aber ich muss eine 100 MB-Datei analysieren, und der Parser mag das nicht sehr viel – Hammerbot

Antwort

2

Verwenden ?, um es "faul" zu machen. Siehe here für Details

<div class\=\"thread\">(.*?)<\/p><\/div>/ 
+0

Das ist richtig, danke, drei Antworten in ein paar Sekunden ... – Hammerbot

+0

Herzlich willkommen, mein Herr. Ich benutze das sehr. – zer00ne

2

Machen Sie die Regex nicht gierig:

regex: /<div class\=\"thread\">(.*?)<\/p><\/div>/ 

Die (.*?) in dem obigen regex sagt bis zum nächsten Schluss passend etwas nach der Eröffnung <div> Schild entsprechen Etikett.

Ihre ursprüngliche Regex war alles gierig bis die letzten übereinstimmenden schließenden Tags.

+0

Vielen Dank für Ihre Antwort! – Hammerbot