2012-12-12 14 views
10

私はTDタグを貪欲に解析しようとしています。私は正規表現として以下を使用していRegex Non-Greedy

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

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

レコードは以下のように返します。

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

それはないなぜ私はこのような何かを始めていますその最初の完全な結果(「もの」で始まるもの)を分割しますか?パラメータの有無にかかわらずTDタグのすべてのインスタンスで分割する正規表現を調整するにはどうすればよいですか?

+0

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

+1

'を参照してくださいしてみてください.'文字クラス '[。]'のリテラルドットを意味し、文字は意味しません。あなたは '[^>] *'で成功するかもしれませんが、属性で '>'を打ち破ることになります(htmlとxmlを扱う正規表現ではなくパーサーをよく見る理由の1つです)。 – Wrikken

+0

@WrikkenここのHTMLはかなり静的です。多くのバリエーションはありませんし、私はそれのために動作する正規表現を知っています。私はそれのためにパーザーの道を行くことはなかった。それを作る方法はありますか?文字は空白を含む「任意の文字」を意味しますか? – steventnorris

答えて

13

したい正規表現は<TD[^>]*>です:

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

注:.は(空白を含む)何も一致し[.]はそう.*?を使用するリテラル.に一致するように[.\s]*?が冗長と間違っています。

+1

デフォルトでは、。新しい行には一致しませんが、\ sには一致します。 –

+0

うわー、これは華麗です... – Hambone

20

非欲張りマッチのために、これは<TD.*?>

+0

これはうまくいっていますが、なぜか私の頭を包み込むことはできません。 – Hambone

+3

@Hambone量子 '*'の後の '?'はRegexエンジンに、 '?'に続く式の最初の一致、つまり '>'です。違いは、欲張りと非貪欲な '*'のためです。 – JustAMartin