Java中用正則從HTML標籤中提取文字2種方法

banq發表於2024-05-19

在 Java 中處理HTML內容時,從 HTML 標記中提取特定文字是很常見的。雖然由於結構複雜,通常不鼓勵使用正規表示式(regex) 來解析 HTML,但有時它足以完成簡單的任務。

在本教程中,我們將瞭解如何使用 Java 中的正規表示式從 HTML 標籤中提取文字。

1、使用模式和匹配器類
Java 提供了java.util.regex中的Pattern和Matcher類,允許我們定義和應用正規表示式來從字串中提取文字。下面是如何使用正規表示式從指定 HTML 標記中提取文字的示例:

@Test
void givenHtmlContentWithBoldTags_whenUsingPatternMatcherClasses_thenExtractText() {
    String htmlContent = <font>"<div>This is a <b>Jdon</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(
"Jdon", extractedTexts.get(0));
    assertEquals(
"extracting text", extractedTexts.get(1));
}

在這裡,我們首先定義 HTML 內容,表示為htmlContent,其中包含帶有<b>標籤的 HTML。此外,我們將標籤名稱tagName指定為“ b ”以從<b>標籤中提取文字。

然後,我們使用compile()方法編譯正規表示式模式,其中patternString是“ <b>(.*?)</b> ”來匹配和提取<b>標籤內的文字。然後,我們使用 while 迴圈和find()方法來迭代所有匹配項並將它們新增到名為extractedTexts的列表中。

最後,我們斷言從<b>標籤中提取了兩個文字(“ Jdon”和“ extracting text ”) 。

為了處理標籤內容可能包含換行符的情況,我們可以透過新增(?s)來修改模式字串,如下所示:

String patternString = <font>"(?s)<" + tagName + ">(.*?)</" + tagName + ">";

在這裡,我們使用啟用 dotall 模式(?s)的正規表示式模式“ (?s)<p>(.*?)</p> ”來匹配多行的<p>標籤。

2、使用JSoup進行HTML解析和提取
對於更復雜的 HTML 解析任務,尤其是涉及巢狀標籤的任務,建議使用JSoup等專用庫。讓我們演示如何使用JSoup從<p>標籤中提取文字,包括處理巢狀標籤:

@Test
void givenHtmlContentWithNestedParagraphTags_thenExtractAllTextsFromHtmlTag() {
    String htmlContent = <font>"<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));
}

在這裡,我們使用parse()方法來解析htmlContent字串,將其轉換為Document物件。接下來,我們在doc物件上使用select()方法來選擇已解析文件中的所有《p》元素。

隨後,我們迭代選定的paragraphElements集合,使用paragraphElement.text()方法從每個《p》元素中提取文字內容。

相關文章