【问题标题】:.NET regular expression - ? isn't working (like I think it should).NET 正则表达式 - ?不起作用(就像我认为应该的那样)
【发布时间】:2009-09-03 15:16:36
【问题描述】:

我有一个 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

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

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

它适用于带有链接的字符串(第三个捕获组 - 其中包含 /a)与链接的关闭匹配,因此我的第二个捕获组可以工作,但它不适用于以下值't 链接,因为(我认为)它正在搜索结束链接标签。我以为?在该捕获组的末尾应使其成为可选。

我正在匹配 RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace |正则表达式选项。单行。

如何让正则表达式匹配值中带有链接的大小写和不匹配的大小写? 谢谢。

【问题讨论】:

  • 样本中的“字段名称”和“字段值”究竟应该是什么?

标签: .net html regex


【解决方案1】:

我会考虑预处理 HTML 并删除已知会导致 regex 实现出错的内容。

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

【讨论】:

  • +1 - 我一直在寻找一个不错的在线正则表达式测试器,谢谢!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    避免使用“.”特点。它通常只会给你带来麻烦……因为它不具体。

    试试这样的:

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

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

    【讨论】:

      【解决方案4】:

      试试:

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

      据我所知,"/a.*>" 看起来太贪心了,我在编写 Regex 时总是尽量具体...这就是我使用 "[^] 的原因+"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-17
        相关资源
        最近更新 更多