C# 正则表达式非贪婪(懒惰)
我正在尝试非贪婪地解析TD标签。我从以下内容开始:C# 正则表达式非贪婪(懒惰),c#,regex,html-table,non-greedy,C#,Regex,Html Table,Non Greedy,我正在尝试非贪婪地解析TD标签。我从以下内容开始: <TD>stuff<TD align="right">More stuff<TD align="right>Other stuff<TD>things<TD>more things stuffMore stuff您想要的正则表达式是]*>: < # Match opening tag TD # Followed by TD [^>]* # Followed
<TD>stuff<TD align="right">More stuff<TD align="right>Other stuff<TD>things<TD>more things
stuffMore stuff您想要的正则表达式是]*>
:
< # Match opening tag
TD # Followed by TD
[^>]* # Followed by anything not a > (zero or more)
> # Closing tag
<#匹配开头标签
TD#后接TD
[^>]*#后跟任何非a>(零或更多)
>#结束标记
注意:
匹配任何内容(包括空格),因此[.\s]*?
是多余的,错误的,因为[.]
匹配文本
,所以使用*?
对于非贪婪匹配,请从
*
量词-零次和无限次之间的匹配,尽可能多
尽可能多次,根据需要回馈(贪婪)
*?
量词-在零次和无限次之间进行匹配,尽可能少地进行匹配,根据需要进行扩展(惰性)
请参见
仅表示字符类[.]
中的文字点,而不是“任何字符”。使用[^>]*
可能会更成功,但它会破坏属性中的
(这就是为什么我们经常使用解析器而不是正则表达式来处理html和xml的原因之一)。@Wrikken这里的html是相当静态的。没有太多的变化,我知道正则表达式将为它工作。因此,我没有选择解析器的路线。有没有一种方法可以让你成功。字符是指包括空格在内的“任何字符”?我不知道如何使用c#修饰符(在pcre中是/s
)使点匹配所有字符。但是,[^>]*>
在功能上等同于(.|\s)*?>
,并且在正则表达式上可能更容易。默认情况下。不匹配新行,但\s匹配。@Hambone,因为量词*
后的?
告诉正则表达式引擎在找到?
后面表达式的第一个匹配项时停止使用符号,即-
。这是因为贪婪与非贪婪的区别*
。
""
"stuff<TD align="right">More stuff<TD align="right>Other stuff"
"things"
"more things"
< # Match opening tag
TD # Followed by TD
[^>]* # Followed by anything not a > (zero or more)
> # Closing tag