2012-12-12 11 views
10

Próbuję non-chciwie parsować tagów TD. Zaczynam coś takiego:Regex Non-Greedy

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

Używam poniżej jako mojego regex:

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

Zapisy wrócić jak poniżej:

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

Dlaczego nie podział pierwszego pełnego wyniku (zaczynającego się od "stuff")? Jak mogę dostosować wyrażenie regularne do podziału na wszystkie wystąpienia tagu TD z parametrami lub bez?

+0

proszę zobaczyć http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+1

'.' oznacza dosłownie kropkę w klasie znaków "[.]", a nie "dowolny znak". Możesz "mieć_ większy sukces z' [^>] * ", ale" złamie "na'> 'w atrybucie (co jest jednym z powodów, dla których często patrzymy na parsery zamiast wyrażeń regularnych do manipulowania html i xml). – Wrikken

+0

@Wrikken HTML tutaj jest dość statyczny. Nie ma dużej różnorodności i znam regex, który by na to działał. Z tego powodu nie poszedłem na drogę parserów. Czy istnieje sposób na zrobienie. znak oznacza "dowolny znak", w tym biały znak? – steventnorris

Odpowiedz

13

regex chcesz to <TD[^>]*>:

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

Uwaga: . pasuje niczego (w tym spacji) tak [.\s]*? jest zbędne i nie tak jak [.] mecze dosłownym . więc używać .*?.

+1

Domyślnie,. nie pasuje do nowego wiersza, ale \ s robi. –

+0

Wow, to jest genialne ... – Hambone

20

Za niedopełnienie meczu chciwy, spróbuj tego <TD.*?>

+0

To działa, ale wciąż nie mogę owinąć się głową, dlaczego ... – Hambone

+3

@Hambone Ponieważ '?' Po kwantyfikatorze '*' mówi silnikowi Regex, aby przestał jeść symbole, gdy znajdzie pierwszy mecz wyrażenia następującego po '?', czyli - '>'. Różnica wynika z chciwości i braku chciwości "*". – JustAMartin