1. 引言
在Java中处理HTML内容时,从特定标签中提取文本是常见需求。虽然通常不建议用正则表达式解析HTML(因其结构复杂),但在简单场景下,正则表达式确实能快速解决问题。
本文将演示如何在Java中使用正则表达式从HTML标签中提取文本。
2. 使用Pattern和Matcher类
Java的java.util.regex
包提供了Pattern
和Matcher
类,让我们能定义和应用正则表达式来提取字符串中的内容。以下是使用正则表达式从指定HTML标签中提取文本的示例:
@Test
void givenHtmlContentWithBoldTags_whenUsingPatternMatcherClasses_thenExtractText() {
String htmlContent = "<div>This is a <b>Baeldung</b> article for <b>extracting text</b> from HTML tags.</div>";
String tagName = "b";
String patternString = "<" + tagName + ">(.*?)</" + tagName + ">";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(htmlContent);
List<String> extractedTexts = new ArrayList<>();
while (matcher.find()) {
extractedTexts.add(matcher.group(1));
}
assertEquals("Baeldung", extractedTexts.get(0));
assertEquals("extracting text", extractedTexts.get(1));
}
这段代码的逻辑很清晰:
- 定义包含
<b>
标签的HTML内容 - 指定目标标签名(这里是"b")
- 构建正则模式
<b>(.*?)</b>
(非贪婪匹配) - 使用
Matcher
遍历所有匹配结果 - 将捕获组(即标签内的文本)存入列表
⚠️ 踩坑提示:如果标签内容包含换行符,默认的正则表达式会失效。需要添加(?s)
开启dotall模式:
String patternString = "(?s)<" + tagName + ">(.*?)</" + tagName + ">";
这样修改后,<p>
标签内的多行文本也能正确匹配。
3. 使用JSoup进行HTML解析与提取
对于包含嵌套标签的复杂HTML,推荐使用专业库如JSoup
。下面演示如何用JSoup提取<p>
标签文本(包括处理嵌套标签):
@Test
void givenHtmlContentWithNestedParagraphTags_thenExtractAllTextsFromHtmlTag() {
String htmlContent = "<div>This is a <p>multiline\nparagraph <strong>with nested</strong> content</p> and <p>line breaks</p>.</div>";
Document doc = Jsoup.parse(htmlContent);
Elements paragraphElements = doc.select("p");
List<String> extractedTexts = new ArrayList<>();
for (Element paragraphElement : paragraphElements) {
String extractedText = paragraphElement.text();
extractedTexts.add(extractedText);
}
assertEquals(2, extractedTexts.size());
assertEquals("multiline paragraph with nested content", extractedTexts.get(0));
assertEquals("line breaks", extractedTexts.get(1));
}
处理流程:
- 用
Jsoup.parse()
将HTML字符串解析为Document
对象 - 通过
doc.select("p")
获取所有<p>
元素 - 遍历元素列表,用
text()
方法提取纯文本(自动处理嵌套标签) - 验证提取结果
✅ 优势对比:
- 正则表达式:简单粗暴,适合简单场景
- JSoup:稳健可靠,能完美处理嵌套标签和HTML结构
4. 总结
我们探讨了在Java中从HTML标签提取文本的两种方案:
- 正则表达式方案:使用
Pattern
和Matcher
类,适合简单标签提取 - JSoup方案:专业HTML解析库,适合处理复杂嵌套结构
选择建议:
- 简单任务 → 正则表达式(快速实现)
- 复杂HTML → JSoup(避免踩坑)
完整示例代码见GitHub仓库