1. 引言

在Java中处理HTML内容时,从特定标签中提取文本是常见需求。虽然通常不建议用正则表达式解析HTML(因其结构复杂),但在简单场景下,正则表达式确实能快速解决问题。

本文将演示如何在Java中使用正则表达式从HTML标签中提取文本。

2. 使用Pattern和Matcher类

Java的java.util.regex包提供了PatternMatcher类,让我们能定义和应用正则表达式来提取字符串中的内容。以下是使用正则表达式从指定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));
}

这段代码的逻辑很清晰:

  1. 定义包含<b>标签的HTML内容
  2. 指定目标标签名(这里是"b")
  3. 构建正则模式<b>(.*?)</b>(非贪婪匹配)
  4. 使用Matcher遍历所有匹配结果
  5. 将捕获组(即标签内的文本)存入列表

⚠️ 踩坑提示:如果标签内容包含换行符,默认的正则表达式会失效。需要添加(?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));
}

处理流程:

  1. Jsoup.parse()将HTML字符串解析为Document对象
  2. 通过doc.select("p")获取所有<p>元素
  3. 遍历元素列表,用text()方法提取纯文本(自动处理嵌套标签)
  4. 验证提取结果

优势对比

  • 正则表达式:简单粗暴,适合简单场景
  • JSoup:稳健可靠,能完美处理嵌套标签和HTML结构

4. 总结

我们探讨了在Java中从HTML标签提取文本的两种方案:

  1. 正则表达式方案:使用PatternMatcher类,适合简单标签提取
  2. JSoup方案:专业HTML解析库,适合处理复杂嵌套结构

选择建议:

  • 简单任务 → 正则表达式(快速实现)
  • 复杂HTML → JSoup(避免踩坑)

完整示例代码见GitHub仓库


原始标题:Extract Text From a HTML Tag with Regex | Baeldung