【问题标题】:Regex [^<^>]* matching max of 6 characters; won't match 7?正则表达式 [^<^>]* 最多匹配 6 个字符;不会匹配7?
【发布时间】:2013-12-22 02:39:54
【问题描述】:

我一直在使用 regexpal 来测试我的正则表达式,但不明白为什么我现在正在测试的那个会失败。

我查阅了几个正则表达式教程和参考资料,但仍然没有看到任何可以解释我遇到这些问题的原因。

我正在测试的正则表达式是:

(<p>\s*(?:(?:<font[^>]*>)*?(?:<a[^>]*>)*?(?:<strong[^>]*>)*?(?:</font>)*?(?:</a>)*?(?:</strong>)*?[^<^>]*)*</p>)?\s*<ul>(.*?)</ul>

有效的数据是:

<p><font size="1" face="Verdana, Arial, Helvetica, sans-serif"><a href="#test1">test1</a> | <a href="#test2">test12</a></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><font size="2"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="2"><strong>Production </strong><a name="prodSupport"></a></font></font></font></font><font face="Verdana, Arial, Helvetica, sans-serif"><strong><font size="2">stuff</font></strong> </font><a name="art"></a></p>
            <ul>
                <li><span style="font-family: Arial"><font size="1"><a id="Assistants" href="Assistants.aspx" name="Assistants">Assistants</a></font></span><font size="1"><a id="Assistants" href="Assistants.aspx" name="Assistants"></a></font></li>
</ul>

而行不通的数据是:

<p><font size="1" face="Verdana, Arial, Helvetica, sans-serif"><a href="#test1">test1</a> | <a href="#test2">test123</a></p>
<p><font face="Verdana, Arial, Helvetica, sans-serif"><font size="2"><font face="Verdana, Arial, Helvetica, sans-serif"><font size="2"><strong>Production </strong><a name="prodSupport"></a></font></font></font></font><font face="Verdana, Arial, Helvetica, sans-serif"><strong><font size="2">stuff</font></strong> </font><a name="art"></a></p>
            <ul>
                <li><span style="font-family: Arial"><font size="1"><a id="Assistants" href="Assistants.aspx" name="Assistants">Assistants</a></font></span><font size="1"><a id="Assistants" href="Assistants.aspx" name="Assistants"></a></font></li>
</ul>

为什么“test12”可以工作而“test123”不行?我完全糊涂了。

【问题讨论】:

  • 您可能想发布您要转换的内容(起始文本和所需结果是什么)?从头开始编写一个正则表达式比用这样一个长的来确定问题更容易。 :)
  • 起始点是:coj.net/departments/office-of-economic-development/… 以及捕获有时出现的类别标题(例如“制作艺术/道具”)的预期结果。正则表达式针对以下正则表达式的结果运行:\s*(?:.*?)(? :]*>)?(.*?)(?:)?(?:.*?) (.*?)跨度>
  • 以前有人问过,但你为什么不用合适的 HTML/DOM 解析器来解析这个?
  • 正则表达式随着时间的推移比将其视为 XML 文档并使用 LINQ 更可靠。如果他们添加菜单或横幅或任何东西,XML 解决方案就会中断,而正则表达式搜索将一直有效,直到他们从根本上改变我所追求的数据格式。
  • 当我尝试你的正则表达式时,这些字符串都不匹配。

标签: regex vb.net


【解决方案1】:

如果可能的话,我会避免抓取某人的网站(理想情况下,您想提取数据馈送)。

否则,如果您只是从以下位置拉链接:http://www.coj.net/departments/office-of-economic-development/film-and-television/production-guide/production-guide-listings.aspx#prodSupport

...我只会抓取&lt;strong&gt;(或您感兴趣的任何单个标签)。如果您最终得到一点垃圾,只需手动删除您不想要的数据。复杂的正则表达式会非常脆弱,并且会在更新 css 或稍微调整页面布局时中断。

【讨论】:

  • 不管它是不是一个好主意,我都想学习一个匹配而另一个不匹配的正则表达式机制
  • 但看起来该站点并没有使用一致的 HTML 格式。有些标题比其他标题大。如果他们手动编辑此页面,甚至可能没有匹配的模式。
  • 如果正则表达式能够始终如一地工作,它将匹配当前站点上的所有内容。看起来我将不得不枚举每个表格行中的标签,然后使用 dom 解析器找到
      之前的元素,然后检查该元素是否与节标题的格式匹配(段落然后随机组合 、 标签,中间有文本)。
【解决方案2】:

我已经开始使用更容易出错的:

(<p>(?:(?!</p>).)*</p>)?\s*<ul>(.*?)</ul>

至少让我继续这份工作。

我检查第一个捕获组,看它是否为空字符串,如果不是,我就去:

input = Regex.Replace(input, "]*>", "")

剥离标签并给我留下类别文本。快速、高效,即使有点脏。

【讨论】:

    猜你喜欢
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    相关资源
    最近更新 更多