有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java试图用<br/>替换<br>、<br>、<br+属性>标记

我正在尝试将大量HTML文档转换为XML遵从性(通过java方法),并且有许多<br>标记(1)未关闭或(2)包含属性。出于某种原因,我使用的正则表达式没有处理包含属性的标记。代码如下:

htmlString = htmlString.replaceAll("(?i)<br *>", "<br/>");

此代码适用于文档中的所有<br>标记;它将它们替换为<br/>。但是,对于像

<BR style="PAGE-BREAK-BEFORE: always" clear=all>

它没有任何作用。我希望所有br标记都是<br/>,而不考虑转换之前标记中的任何属性

为了实现这一点,我需要在正则表达式中添加什么


共 (4) 个答案

  1. # 1 楼答案

    你必须使用.*而不是*

    htmlString.replaceAll("(?i)<br .*>", "<br/>")
    //-----------------------------^^
    

    因为:

    * Match the preceding character or subexpression 0 or more times.

    .* Matches any character zero or many times

    所以对于你的情况:

    String htmlString = "<BR style=\"PAGE-BREAK-BEFORE: always\" clear=all>";
    System.out.println(htmlString.replaceAll("(?i)<br .*>", "<br/>"));
    

    输出

    <br/>
    
  2. # 2 楼答案

    这个正则表达式将执行您想要的操作:<(BR|br)[^>]*>

    下面是一个工作示例:Regex101

  3. # 3 楼答案

    您可能希望<br\b[^>]*>匹配所有

    • <br开始
    • <br后面有一个分词符(例如,这样你就不会匹配<brown>标记)
    • 包含任意数量的非>字符,包括0
    • >结尾
  4. # 4 楼答案

    使用正则表达式解析HTML不是一个好主意,因为HTML不是正则表达式。应该使用适当的解析库,如NekoHTML

    NekoHTML is a simple HTML scanner and tag balancer that enables application programmers to parse HTML documents and access the information using standard XML interfaces. The parser can scan HTML files and "fix up" many common mistakes that human (and computer) authors make in writing HTML documents. NekoHTML adds missing parent elements; automatically closes elements with optional end tags; and can handle mismatched inline element tags.