在 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》元素中提取文字內容。