【问题标题】:Regex in Java, finding start and end tagJava中的正则表达式,查找开始和结束标记
【发布时间】:2010-10-05 11:15:52
【问题描述】:

我正在尝试在 HTML 文档中查找数据。我不需要一个成熟的解析器,因为它只是一个标签之间的数据。

但是,我想检测“选择”标签和介于两者之间的数据。

return Pattern.compile(pattern, 
                       Pattern.CASE_INSENSITIVE | Pattern.MULTILINE |
                       Pattern.DOTALL);

/// End right angle bracket left off intentionally:
track_pattern_buf.append("<select");
track_pattern_buf.append("(.*?)");
track_pattern_buf.append("</select");

这是您要使用的“正则表达式”吗?

【问题讨论】:

    标签: java html regex matcher


    【解决方案1】:

    如果你真的想用正则表达式进行拼接(这不是最佳选择),我会使用:

    "<select[^>]*>(.+?)</select\s*>"
    

    【讨论】:

    • 嘿,我尝试了你的正则表达式,它适用于一行中的标签,但不适用于多个标签。在这里检查 - regexr.com/38udu你能帮忙改变什么,以便它跨多行选择标签
    • @NitishDhar . 不匹配换行符;请改用[^][\s\S]
    【解决方案2】:

    我会使用类似的东西:

    "<select>([^<>]+)</select>"
    

    我不确定你为什么不使用“>”,而且我不想匹配其他标签(这里我假设我们正在寻找文本数据而不是文档片段)。

    话虽如此,我真的会考虑获取一个 DOM 并使用 XPath(或类似的)来执行您的查询,因为正则表达式不是 well known for their ability to deal with trees

    【讨论】:

    • 去掉开始标签中的“>”,以防有属性。我认为没有理由将其从结束标签中删除。
    • 这将无法匹配
    • 这些是我强烈建议您使用 XPath 而不是将一个讨厌的正则表达式放在一起的众多原因中的一些,如果您实际上并不关心属性值、命名空间、实体等。
    【解决方案3】:

    我认为更安全的是有这样的东西:

    "<\s*select\s*>(.*?)<\s*/select\s*>"
    

    为了更安全,您可能应该在第一次选择之后添加 \w*,以防出现任何其他选择选项。

    如果您的 HTML 符合标准,第三个 \s* 也可能会被跳过。

    【讨论】:

    • 如果“其他选择选项”是指 SELECT 标签属性,\w* 不会删除它。另外,我认为在左尖括号之后不需要允许空格。除非 OP 提出更详细的要求,否则@Gumbo 的正则表达式是可行的方法。
    • 这将不匹配&lt;select class="mark"&gt;text&lt;/select&gt;,甚至添加\w*
    【解决方案4】:

    我知道您认为您不需要一个成熟的解析器 - 我们都曾在某个时候编写过 HTML 正则表达式解析器,并认为“我的用例是如此简单,我当然可以使用正则表达式 this 时间!”

    但我认为每个已经完成它的人最终都会得出结论,将繁重的工作外包给现有的众多优秀解析器之一会更快、更容易、更简单和更安全。我知道我有。

    查看jSoup - 它简单、快速且有效。真的没有理由不使用它。

    如果你仍然不相信,你必须来询问正确的模式是什么 - 你得到了三个不同的答案作为回应 - 没有一个能完成整个工作 -应该说明问题比乍看之下要复杂得多。

    【讨论】:

      【解决方案5】:

      根据您的需要,我还建议您进行负面预测,以确保您在第一次出现 select 时停止。

      "(?<selectGroupName><select>((?:(?!select).)*)</select>)"
      

      这里的重要部分是“((?:(?!select).)*)”,它接受任何与否定前瞻不冲突的内容。

      同样可以通过使用惰性量词来实现:

      "(?<selectGroupName><select>(.*?)</select>)"
      

      这些都可以确保您在第一次出现时停止,从而阻止您同时参加多个部分。然而,它并不能保护您免受嵌套选择标签的影响,相反,这些标签会导致此表达式出现问题。 使用此表达式,以下将是一个问题:

      <select>
          <select>
          </select>
      </select>
      

      如果没有前瞻或惰性量词,以下将是一个问题:

      <select>
      </select>
      <a>
          <select>
          </select>
      </a>
      

      【讨论】:

        猜你喜欢
        • 2011-07-25
        • 1970-01-01
        • 2019-08-10
        • 1970-01-01
        • 1970-01-01
        • 2012-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多