Ich stimme zu, dass das richtige Werkzeug zum Parsen von XML und insbesondere HTML ist ein Parser und keine Engine für reguläre Ausdrücke. Wie jedoch bereits von anderen erwähnt, ist die Verwendung eines Regex manchmal schneller und einfacher und erledigt die Aufgabe, wenn man das Datenformat kennt.
Microsoft hat tatsächlich einen Abschnitt von Bewährte Praktiken für reguläre Ausdrücke im .NET Framework und spricht speziell über Berücksichtigung der Eingabequelle .
Reguläre Ausdrücke haben zwar ihre Grenzen, aber haben Sie schon einmal an Folgendes gedacht?
Das .NET-Framework ist einzigartig, wenn es um reguläre Ausdrücke geht, da es Folgendes unterstützt Definitionen der Bilanzkreise .
Aus diesem Grund glaube ich, dass man XML mit regulären Ausdrücken parsen KANN. Beachten Sie jedoch, dass es muss gültiges XML sein ( Browser sind sehr nachsichtig mit HTML und erlauben schlechte XML-Syntax innerhalb von HTML ). Dies ist möglich, da die "Ausgleichsgruppendefinition" der Engine für reguläre Ausdrücke erlaubt, als PDA zu fungieren.
Zitat aus dem oben zitierten Artikel 1:
.NET Engine für reguläre Ausdrücke
Wie oben beschrieben, können ausgewogene Konstrukte nicht beschrieben werden durch einen regulären Ausdruck beschrieben werden. Allerdings bietet die .NET-Engine für reguläre Ausdrücke bietet jedoch einige Konstrukte, mit denen ausgewogene Konstrukte erkennen.
(?<group>)
- schiebt das erfasste Ergebnis auf den Erfassungsstapel mit der Namensgruppe.
(?<-group>)
- hebt das oberste Capture mit der Namensgruppe aus dem Erfassungsstapel.
(?(group)yes|no)
- stimmt mit dem Ja-Teil überein, wenn es eine Gruppe gibt mit dem Namen group existiert, ansonsten passt kein Teil.
Diese Konstrukte ermöglichen es einem regulären .NET-Ausdruck, einen eingeschränkten PDA zu emulieren, indem er im Wesentlichen einfache Versionen der Stack Operationen: push, pop und empty. Die einfachen Operationen sind ziemlich genau äquivalent zu inkrementieren, dekrementieren bzw. mit Null zu vergleichen. Dies ermöglicht es der .NET-Engine für reguläre Ausdrücke, eine Teilmenge der kontextfreien Sprachen zu erkennen, insbesondere die, die nur einen einfachen Zähler benötigen. Dies wiederum ermöglicht es den nicht-traditionellen .NET reguläre Ausdrücke einzelne korrekt ausgeglichene Konstrukte.
Betrachten Sie den folgenden regulären Ausdruck:
(?=<ul\s+id="matchMe"\s+type="square"\s*>)
(?>
<!-- .*? --> |
<[^>]*/> |
(?<opentag><(?!/)[^>]*[^/]>) |
(?<-opentag></[^>]*[^/]>) |
[^<>]*
)*
(?(opentag)(?!))
Verwenden Sie die Flaggen:
- Singleline
- IgnorePatternWhitespace (nicht erforderlich, wenn Sie Regex kollabieren und alle Leerzeichen entfernen)
- IgnoreCase (nicht erforderlich)
Reguläre Ausdrücke erklärt (inline)
(?=<ul\s+id="matchMe"\s+type="square"\s*>) # match start with <ul id="matchMe"...
(?> # atomic group / don't backtrack (faster)
<!-- .*? --> | # match xml / html comment
<[^>]*/> | # self closing tag
(?<opentag><(?!/)[^>]*[^/]>) | # push opening xml tag
(?<-opentag></[^>]*[^/]>) | # pop closing xml tag
[^<>]* # something between tags
)* # match as many xml tags as possible
(?(opentag)(?!)) # ensure no 'opentag' groups are on stack
Sie können dies unter Ein besserer .NET-Prüfer für reguläre Ausdrücke .
Ich habe die Beispielquelle von verwendet:
<html>
<body>
<div>
<br />
<ul id="matchMe" type="square">
<li>stuff...</li>
<li>more stuff</li>
<li>
<div>
<span>still more</span>
<ul>
<li>Another >ul<, oh my!</li>
<li>...</li>
</ul>
</div>
</li>
</ul>
</div>
</body>
</html>
Damit wurde die Übereinstimmung gefunden:
<ul id="matchMe" type="square">
<li>stuff...</li>
<li>more stuff</li>
<li>
<div>
<span>still more</span>
<ul>
<li>Another >ul<, oh my!</li>
<li>...</li>
</ul>
</div>
</li>
</ul>
obwohl es eigentlich so aussah:
<ul id="matchMe" type="square"> <li>stuff...</li> <li>more stuff</li> <li> <div> <span>still more</span> <ul> <li>Another >ul<, oh my!</li> <li>...</li> </ul> </div> </li> </ul>
Schließlich hat mir der Artikel von Jeff Atwood sehr gut gefallen: Parsen von Html auf die Cthulhu-Art . Lustigerweise wird die Antwort auf diese Frage zitiert, die derzeit über 4k Stimmen hat.