2012-12-12 8 views
10

Ich versuche, nicht-gierig TD-Tags aussortieren. Ich beginne mit etwas wie folgt aus:Regex Non-Greedy

<TD>stuff<TD align="right">More stuff<TD align="right>Other stuff<TD>things<TD>more things 

ich die unten als meine regex:

Regex.Split(tempS, @"\<TD[.\s]*?\>"); 

Die Datensätze zurück, wie unten:

"" 
"stuff<TD align="right">More stuff<TD align="right>Other stuff" 
"things" 
"more things" 

Warum ist es nicht das erste volle Ergebnis aufteilen (das mit "stuff" anfangen)? Wie kann ich die Regex anpassen, um alle Instanzen des TD-Tags mit oder ohne Parameter zu teilen?

+0

Bitte sehen http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+1

'.' bedeutet einfach einen Literalpunkt in der Zeichenklasse '[.]', nicht 'irgendein Zeichen. Mit _ [^>] * 'könnten Sie _mehr_ Erfolg haben, _aber mit einem'> 'in einem Attribut (was einer der Gründe ist, warum wir uns oft die Parser anschauen, sondern die Regexes, um HTML & Xml zu manipulieren). – Wrikken

+0

@Wrikken Das HTML ist hier ziemlich statisch. Es gibt nicht viel Variation und ich kenne die Regex, die dafür arbeiten würde. Ich bin deswegen nicht auf Parser gegangen. Gibt es eine Möglichkeit, das zu machen? Zeichen bedeuten 'irgendein Zeichen' inklusive Leerzeichen? – steventnorris

Antwort

13

Die Regex Sie wollen, ist <TD[^>]*>:

<  # Match opening tag 
TD # Followed by TD 
[^>]* # Followed by anything not a > (zero or more) 
>  # Closing tag 

Hinweis: . alles passt (einschließlich Leerzeichen) so [.\s]*? ist überflüssig und falsch als [.] eine wörtliche Spiele . so .*? verwenden.

+1

Standardmäßig. passt nicht zur neuen Zeile, aber \ s tut es. –

+0

Wow, das ist brilliant ... – Hambone

20

Für Nicht gierige Spiel, versuchen diese <TD.*?>

+0

Das funktioniert, aber ich kann immer noch nicht meinen Kopf darum herumlegen, warum ... – Hambone

+3

@Hambone Weil '?' Nach dem Quantifizierer '*' sagt der Regex-Engine aufhören, Symbole zu essen, wenn es findet die erste Übereinstimmung des Ausdrucks, der auf "?" folgt, also ->. Der Unterschied ist wegen des gierigen vs. nicht-gierigen '*'. – JustAMartin