.Net正则表达式
我有一个.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>)+
我在这种情况下期待的是两个捕获的组。 第一组的“重新”组将是空白的(未命中),但第二组的“重新”组将被填充。 然而,“新”组总是空白,我尝试了多种变体,并尽可能地将其简化为无效。 我也使用RegexOptions.Singleline选项来确保“。” 也匹配换行符。 关于我失踪的任何想法?
提前致谢。
我认为你滥用(如果不是滥用)正则表达式引擎。 既然你已经必须检查一个已知的字符序列是否可以在字符串中,你不能使用一个简单的String.Contains()
吗?
现在,为什么这个正则表达式不会捕获属性值。 ?
和.*
是贪婪的量词,而.*?
是懒惰的。 让我们在这些子模式周围添加捕获组,以查看我们正在捕获的是什么:
(<td class="program">(.*?)(?<isnew>font-icon-new)?(.*)</td>)+
组2( (.*?)
)为NULL
! <td class="program">
之后的所有内容都被捕获到组3( (.*)
)中。 看看这个摘录(从这里取):
如果决定是在“做一个尝试”和“跳过一个尝试”之间进行的,与由量词管理的项目一样,引擎总是选择首先尝试贪婪的量词,并首先跳过对懒惰贪婪)。 - 掌握正则表达式,第159页
我能想象的最好的正则表达式修复方法是将可选字词和下一个字词组合在一起.*?
模式转换为可选(贪婪)非捕获组,如(?:(?<isnew>font-icon-new).*?)?
:
(<td class="program">.*?(?:(?<isnew>font-icon-new).*?)?</td>)+
Expresso中的结果( 注意: Singleline
模式为ON):
上一篇: .Net Regex