我有一个HTML页面(它是一个内部地址簿应用程序),我试图从表格中匹配字段名称和字段值。
到目前为止,我做过的正则表达式是
"href.*?>(.*?)<\\/a.*>(.*?)<\\/span"
匹配大多数键和值就好了。问题是某些值也是链接。
示例字符串(没有链接 - 工作)
href="JavaScript:updateField("peopleType", "390061", "bob.bobson@company.com", "bob", "Reg", "Bob Bobson");" 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("dept", "390061", "bob.bobson@company.com", "bob", "Reg", "Bob Bobson");" 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。
如何让正则表达式将值与值中的链接相匹配,而不是? 感谢。
答案 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;] +”