web-dev-qa-db-ja.com

正規表現の貪欲でない(怠惰な)

TDタグを貪欲に解析しようとしています。次のようなものから始めています:

<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タグのすべてのインスタンスで分割するように正規表現を調整するにはどうすればよいですか?

20
steventnorris

必要な正規表現は<TD[^>]*>です:

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

注:.はすべて(空白を含む)に一致するため、[.\s]*?は冗長で間違っています。[.]はリテラル.に一致するため、.*?を使用してください。

14
Chris Seymour

欲張りでない一致の場合は、これを試してください<TD.*?>

35
Jason

から https://regex101.com/

  • * Quantifier —ゼロ時間と無制限の時間の間で可能な限り一致し、必要に応じて返します(貪欲)
  • *? Quantifier —ゼロ時間と無制限時間の間で一致します可能な限り少ない回数、必要に応じて拡張します(遅延)
3