.Net正则表达式 - 非捕获组始终为空白

时间:2015-05-07 00:25:38

标签: asp.net regex

我有一个.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选项来确保“。”也匹配换行符。关于我缺少的任何想法?

提前致谢。

1 个答案:

答案 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 ):

enter image description here