不推荐用正则提取复杂或嵌套XML,仅适用于结构简单、格式固定的单层标签;需避免贪婪匹配、处理换行空白、转义特殊字符;Pattern.DOTALL配合负向先行断言可提取最外层标签;但遇注释、CDATA、嵌套即失效,生产环境应优先使用JSoup等专用解析器。

Java中用正则提取XML片段不推荐用于复杂或嵌套XML,但对结构简单、格式固定的XML片段(如单层标签、无属性或属性简单、无嵌套同名标签)可以快速提取。关键在于:避免贪婪匹配、正确处理换行和空白、转义特殊字符。
用Pattern和Matcher提取最外层XML标签
假设文本中有一段类似 的独立片段,且确定不会嵌套:
String text = "无关内容- 其他内容"; String regex = "
苹果 5.5 - ]*>[^<]*(?:<(?!/item>)[^<]*)*
"; Pattern pattern = Pattern.compile(regex, Pattern.DOTALL); Matcher matcher = pattern.matcher(text); if (matcher.find()) { System.out.println(matcher.group()); // 提取到完整- ...
}
说明:
-
[^>]*匹配开始标签内非>的属性内容,防止跨标签 (?:)[^ 是非捕获组,匹配内部任意内容,但遇到就停止(负向先行断言)-
Pattern.DOTALL让.可匹配换行符
提取带可选属性的通用标签(如... )
若需适配不同标签名(如 、),可用动态构建正则:
立即学习“Java免费学习笔记(深入)”;
String tagName = "user"; String regex = "<" + tagName + "[^>]*>[^<]*(?:<(?!/" + tagName + ">)[^<]*)*" + tagName + ">";
注意:
- tagName 需先用
Pattern.quote()转义(如果可能含正则元字符) - 该方式仍不支持多层嵌套(如
中的会被误判为结束)
更安全的替代方案:用JSoup解析HTML/XML片段
如果文本中XML结构较规范(即使没DTD或命名空间),用轻量库比正则更可靠:
// Maven: org.jsoup:jsoup
Document doc = Jsoup.parseBodyFragment(text); // 自动修复不闭合标签
Elements items = doc.select("item"); // CSS选择器,支持属性过滤如 item[id=123]
for (Element item : items) {
System.out.println(item.outerHtml()); // 完整XML片段
}
优势:
- 自动处理换行、空格、实体编码(如
&) - 支持嵌套、属性筛选、XPath式查找(通过扩展)
- 不会因格式微小变化(如多空格、自闭合写法)而失效
注意事项和常见坑
正则提取XML容易出错,务必避开这些情况:
- 不要用
<.>这类简单模式——它会跨标签匹配,导致截断或错位 - XML注释
、CDATA段、处理指令()会让正则彻底失效 - 标签名大小写敏感,正则默认区分,如需忽略大小写加
Pattern.CASE_INSENSITIVE - 如果原始文本是完整XML文档,直接用
DocumentBuilder解析更稳妥
基本上就这些。正则适合临时脚本或日志中提取固定格式XML块;生产环境涉及结构化数据,优先用专用解析器。










