正则表达式非贪婪(懒惰)

ste*_*ris 17 c# regex html-table non-greedy

我试图非贪婪地解析TD标签.我是从这样的事情开始的:

<TD>stuff<TD align="right">More stuff<TD align="right>Other stuff<TD>things<TD>more things
Run Code Online (Sandbox Code Playgroud)

我正在使用以下作为我的正则表达式:

Regex.Split(tempS, @"\<TD[.\s]*?\>");
Run Code Online (Sandbox Code Playgroud)

记录返回如下:

""
"stuff<TD align="right">More stuff<TD align="right>Other stuff"
"things"
"more things"
Run Code Online (Sandbox Code Playgroud)

为什么不拆分第一个完整的结果(以"stuff"开头的那个)?如何在有或没有参数的TD标签的所有实例上调整正则表达式以进行拆分?

Jas*_*son 35

对于非贪婪的比赛,试试这个 <TD.*?>

  • @Hambone因为`?`之后,量词`*`告诉Regex引擎在找到符号`?`后面的表达式的第一个匹配时停止吃符号,即 - >``.不同之处在于贪婪与非贪婪的`*`. (10认同)

Chr*_*our 14

你想要的正则表达式是<TD[^>]*>:

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

注意:.匹配任何东西(包括空格)所以[.\s]*?是多余的和错误的[.]匹配文字.所以使用.*?.

  • 默认情况下, .与新行不匹配,但\ s确实如此. (2认同)

Bas*_*mme 11

来自https://regex101.com/

  • * 量词 - 在零次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)
  • *?量词 - 在零次和无限次之间匹配,尽可能少,根据需要扩展(懒惰)