
Java中用正则提取XML片段不推荐用于复杂或嵌套XML,但对结构简单、格式固定的XML片段(如单层标签、无属性或属性简单、无嵌套同名标签)可以快速提取。关键在于:避免贪婪匹配、正确处理换行和空白、转义特殊字符。
假设文本中有一段类似 <item>...</item> 的独立片段,且确定不会嵌套:
String text = "无关内容<item id=\"123\"><name>苹果</name><price>5.5</price></item>其他内容";
String regex = "<item[^>]*>[^<]*(?:<(?!/item>)[^<]*)*</item>";
Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println(matcher.group()); // 提取到完整 <item>...</item>
}
说明:
[^>]* 匹配开始标签内非>的属性内容,防止跨标签(?:)[^ 是非捕获组,匹配内部任意内容,但遇到 <code> 就停止(负向先行断言)Pattern.DOTALL 让 . 可匹配换行符若需适配不同标签名(如 <user></user>、<config></config>),可用动态构建正则:
立即学习“Java免费学习笔记(深入)”;
String tagName = "user"; String regex = "<" + tagName + "[^>]*>[^<]*(?:<(?!/" + tagName + ">)[^<]*)*</" + tagName + ">";
注意:
Pattern.quote() 转义(如果可能含正则元字符)<user><profile></profile></user> 中的 <profile></profile> 会被误判为结束)如果文本中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片段
}
优势:
&)正则提取XML容易出错,务必避开这些情况:
<.></.> 这类简单模式——它会跨标签匹配,导致截断或错位<!-- ... -->、CDATA段、处理指令(<?xml ...?>)会让正则彻底失效Pattern.CASE_INSENSITIVE
DocumentBuilder 解析更稳妥基本上就这些。正则适合临时脚本或日志中提取固定格式XML块;生产环境涉及结构化数据,优先用专用解析器。