我正在尝试将一堆HTML文档转换为XML合规性(通过java方法),并且有很多<br>
标记,它们(1)是未闭合的,或者(2)包含属性。出于某种原因,我正在使用的正则表达式不会解决包含属性的标记。这是代码:
htmlString = htmlString.replaceAll("(?i)<br *>", "<br/>");
此代码适用于文档中的所有<br>
标记;它用<br/>
替换它们。但是,对于像
<BR style="PAGE-BREAK-BEFORE: always" clear=all>
它没有做任何事情。我希望所有br标记都只是<br/>
,无论转换前标记中的任何属性如何。
为了达到这个目的,我需要添加到我的正则表达式中?
答案 0 :(得分:1)
您可能希望<br\b[^>]*>
匹配所有
<br
<br
之后进行分词(因此您不会与<brown>
代码匹配,例如>
字符,包括0 >
答案 1 :(得分:1)
您必须使用.*
代替*
:
htmlString.replaceAll("(?i)<br .*>", "<br/>")
//-----------------------------^^
因为:
*
将前面的字符或子表达式匹配0次或更多次。
和
.*
匹配任何字符零次或多次
所以对你的情况来说:
String htmlString = "<BR style=\"PAGE-BREAK-BEFORE: always\" clear=all>";
System.out.println(htmlString.replaceAll("(?i)<br .*>", "<br/>"));
<强>输出强>
<br/>
答案 2 :(得分:1)
此正则表达式将按您的要求执行:<(BR|br)[^>]*>
以下是一个工作示例:Regex101
答案 3 :(得分:0)
使用正则表达式解析HTML不是一个好主意,因为HTML不是常规的。您应该使用正确的解析库,如NekoHTML。
NekoHTML是一个简单的HTML扫描仪和标记平衡器,可以启用 应用程序员解析HTML文档并访问 使用标准XML接口的信息。解析器可以扫描HTML 文件和&#34;修复&#34;人(和计算机)的许多常见错误 作者撰写HTML文档。 NekoHTML添加了缺少的父级 要素;自动关闭带有可选结束标记的元素;和 可以处理不匹配的内联元素标记。