.NET正则表达式 - ?不工作(就像我认为的那样)

时间:2009-09-03 15:16:37

标签: .net html regex

我有一个HTML页面(它是一个内部地址簿应用程序),我试图从表格中匹配字段名称和字段值。

到目前为止,我做过的正则表达式是

"href.*?>(.*?)<\\/a.*>(.*?)<\\/span"

匹配大多数键和值就好了。问题是某些值也是链接。

示例字符串(没有链接 - 工作)

href="JavaScript:updateField(&quot;peopleType&quot;, &quot;390061&quot;, &quot;bob.bobson@company.com&quot;, &quot;bob&quot;, &quot;Reg&quot;, &quot;Bob Bobson&quot;);" onMouseOver="window.status='Update this field if possible, else explain how to update it';return true;" onMouseOut="window.status='';return true;">Emp Type</a></span></td>
<td nowrap=""><span style="font-family: Arial, Times New Roman, Courier New, Courier, monospace; color: #006699">Reg</span

示例字符串(带链接 - 不起作用)

href="JavaScript:updateField(&quot;dept&quot;, &quot;390061&quot;, &quot;bob.bobson@company.com&quot;, &quot;bob&quot;, &quot;Reg&quot;, &quot;Bob Bobson&quot;);" onMouseOver="window.status='Update this field if possible, else explain how to update it';return true;" onMouseOut="window.status='';return true;">Dept</a></span></td>
<td nowrap=""><span style="font-family: Arial, Times New Roman, Courier New, Courier, monospace">
<a href="JavaScript:showDept('TheBobs');" onMouseOver="window.status='Show People in This Dept';return true;" onMouseOut="window.status='';return true;">TheBobs</a></span

上半部分(捕获密钥)正常工作。问题(似乎是)贪婪的。*一直匹配到链接的末尾,在那里找到结束的插入符然后是非贪婪的。*?在捕获组中没有任何东西可以匹配。我试过RegEx

"href.*?>(.*?)<\\/a.*>(.*?)(<\\/a>)?<\\/span"

对链接的字符串工作得很好(第三个捕获组 - 其中包含/ a)匹配链接的关闭,所以我的第二个捕获组工作,但是它不适用于不是的值链接因为(我认为)它正在搜索结束链接标记。我以为?在该捕获组的末尾应该使它成为可选项。

我正在与RegexOptions.IgnoreCase匹配RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline。

如何让正则表达式将值与值中的链接相匹配,而不是? 感谢。

4 个答案:

答案 0 :(得分:3)

我会考虑预处理HTML并删除已知会使正则表达式实现更快的内容。

就测试人员而言,你也可以使用Regex Hero,因为Silverlight的Regex实现是兼容的.NET。

答案 1 :(得分:1)

有一个名为Regex Coach的免费工具,可用于轻松调试正则表达式。

答案 2 :(得分:1)

避免使用“。”字符。它通常只给你带来麻烦...因为它是非特定的。

尝试这样的事情:

href=[^>]*>([^<]*)</a\s*>((?:(?!</span\s*>).)*)

注意:由于您的示例不返回名称 - 值对,而只是一个名称(假设第一个捕获组是名称),我不知道您希望它匹配什么。也许发布一个更完整的样本,并准确指出你想要捕获的部分。

答案 3 :(得分:0)

尝试:

href[^<>]+>(.*?)<\\/a[^<>]*>(.*?)<\\/span

据我所知,它看起来像“/a.*>”太贪婪了,我总是试着在写正则表达式时尽可能具体......我为什么用“[^&lt;&gt;] +”