【问题标题】:i want to capture all tags not having a specific tag我想捕获所有没有特定标签的标签
【发布时间】:2009-06-25 09:19:13
【问题描述】:

我想捕获所有名为“STRONG”的标签,我可以使用<STRONG.*?</STRONG>,这工作得很好,但如果“SPAN”标签出现在这些标签中,我不想捕获这些标签我想要<STRONG.*(^(SPAN)).*?</STRONG>之类的东西 这是示例文本

<STRONG> For technical <SPAN id=PageBreak>101</SPAN> please</STRONG>
<SPAN id=PageBreak type="4">56</SPAN><STRONG> visit</STRONG>

我想捕获第二个强标签,而不是第一个

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

    您正在尝试使用正则表达式解析 HTML 结构,由于 HTML 语言不是正则表达式,这注定会失败(请参阅hierarchy of formal languages)。

    改用 HTML 解析器,例如HTML Agility Pack。另见theseotherquestions

    【讨论】:

    • 没有人...这只是一个例子...我使用格式良好的 html 它不是问题的一部分天气它是否格式正确你只是提供答案...。 :P
    • 破旧的,不,即使格式良好的 HTML 也不正常。正则表达式只是创建有限状态自动机的简写符号。有限状态自动机无法解析 HTML。这是一个数学事实。
    • 格式是否正确与我的回答完全无关。唯一的区别是,如果您使用格式良好的 XHTML(或 XML 样式的 HTML5),则可以使用 XML 解析器而不是 HTML 解析器。无论哪种方式,正则表达式都不适合这项任务。
    【解决方案2】:

    康拉德是对的。

    但如果你不关心即将到来的厄运,你可以尝试类似

    /<STRONG>\w+?<\/STRONG>/
    

    如果 STRONG 标记包含任何非单词字符,例如 '&lt;''&lt;SPAN&gt;',则会忽略它们,但无疑会因任何异常而失败...回到正题关于注定失败的尝试。

    【讨论】:

    • “但如果你不关心即将到来的厄运”——说得好! :D
    • 我不想只留下 SPAN 标签,就像你提到的 '
    • 如果每个 STRONG 元素恰好包含一个单词,这将起作用。显然不是这样的。
    【解决方案3】:

    这是XPath 的典型用例。例如,查询可能是:

    **/strong[not(child::span)]/text()
    

    【讨论】:

    • 很好的答案。我本来想自己发布 XPath,但我不确定语法(现在我发现我可能弄错了)。
    • @Konrad:谢谢@shabby:祝你好运,也许厄运会避开你。
    • “不,我想用锤子,不是螺丝刀。”
    【解决方案4】:

    如果您只是想大致了解如何匹配不包含特定字符序列的文本,这是最常见的方法:

    Regex re = new Regex(@"<STRONG(?:(?!<SPAN).)*?</STRONG>",
        RegexOptions.IgnoreCase | RegexOptions.Singleline);
    

    【讨论】:

      猜你喜欢
      • 2017-01-05
      • 2018-02-21
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多