我有一个.Net应用程序使用正则表达式从某些HTML中提取信息。 html不符合XML,因此我无法使用XDoc解析它。这是我遇到问题的一小段html:
<td class="program">
<div>
<h2>
The O'Reilly Factor
</h2>
</div>
</td>
<td class="program">
<div>
<span class="font-icon-new">New</span>
<h2>
The Kelly File
</h2>
</div>
</td>
我正在使用的正则表达式是:
(<td class="program">.*?(?<isnew>font-icon-new)?.*</td>)+
我在这种情况下期待的是两个被捕获的群体。第一组的“isnew”组将为空白(未命中),但第二组的“isnew”组将被填充。但是,“isnew”组始终是空白的,我尝试了多种变体并尽可能地将其简化为无济于事。我也使用RegexOptions.Singleline选项来确保“。”也匹配换行符。关于我缺少的任何想法?
提前致谢。
答案 0 :(得分:0)
我认为你正在滥用(如果不是滥用)正则表达式引擎。既然你必须检查字符串中是否有已知的字符序列,那么你不能使用简单的String.Contains()
吗?
现在,为什么这个正则表达式不捕获属性值。 ?
和.*
是贪婪的量词,而.*?
是懒惰的。让我们在这些子模式周围添加捕获组,以查看我们正在捕获的内容:
(<td class="program">(.*?)(?<isnew>font-icon-new)?(.*)</td>)+
第2组((.*?)
)是NULL
! <td class="program">
之后的所有内容都会被捕获到第3组((.*)
)。看一下这段摘录(取自here):
在决定是在“尝试”和“尝试”之间的情况下 “跳过一次尝试,”与量词,引擎管理的项目一样 总是选择首先尝试贪婪量词,并且 首先跳过懒惰(非贪婪)的尝试。 - 掌握 正则表达式,第159页
我能想象的最好的正则表达式修复方法是将可选单词和下一个.*?
模式组合成一个可选(贪婪)非捕获组,如(?:(?<isnew>font-icon-new).*?)?
:
(<td class="program">.*?(?:(?<isnew>font-icon-new).*?)?</td>)+
Expresso中的结果(注意: Singleline
模式 ON ):