4 Stimmen

.NET Regex stimmt im Code nicht überein, funktioniert aber in jedem Test-Harness

Das hier ist für mich ein echtes Kopfzerbrechen...

var matches = Regex.Matches("<p>test something<script language=\"javascript\">alert('hello');</script> and here's <b>bold</b> and <i>italic</i> and <a href=\"http://popw.com/\">link</a>.</p>", "</?(?!p|a|b|i)\b[^>]*>");

Die Regex soll jedes HTML-Tag (offen oder geschlossen) erfassen, das nicht p, a, b oder i ist. Ich habe die Eingabezeichenfolge und die Regex in unzählige Testseiten eingefügt, und jede von ihnen gibt das Skript-Tag (offen und geschlossen) als Treffer zurück. Aber im Code funktioniert es absolut nicht. Die Variable matches hat einen Wert von 0.

Übersehe ich etwas unglaublich Offensichtliches?

8voto

Guffa Punkte 663241

Sie haben vergessen, den Backslash in der Musterzeichenfolge zu entschlüsseln.

"</?(?!p|a|b|i)\\b[^>]*>"

0voto

Markus Jarderot Punkte 83090

(?! ) ist eine negative Vorausschau. Er stimmt mit null Zeichen überein, wenn das darin enthaltene Muster ab der aktuellen Position nicht übereinstimmt.

(?!p|a|b|i)\\b prüft das nächste Zeichen, um zu sehen, ob es übereinstimmt p|a|b|i . Wenn dies der Fall ist, kann die Vorausschau keine Übereinstimmung finden. Wenn das enthaltene Muster nicht übereinstimmt, ist die Vorausschau erfolgreich und versucht, das nächste Token des Musters an derselben Position zu finden. In diesem Fall eine Wortgrenze.

Was Sie wollen, ist wahrscheinlich so etwas wie das hier:

@"</?(?!(?:p|a|b|i)\b)\w+[^>]*>"

Sie sucht vorausschauend nach etwas, das zu (?:p|a|b|i)\b . Wenn das Muster nicht übereinstimmt, ist die Vorausschau erfolgreich, und es wird mindestens ein Wortzeichen übereinstimmen, gefolgt von einer beliebigen Anzahl von Zeichen bis zum Schlusszeichen ">" .

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