Java實現(xiàn)將Markdown轉(zhuǎn)換為純文本
以下是兩種在 Java 中實現(xiàn) Markdown 轉(zhuǎn)純文本的主流方法,根據(jù)需求選擇適合的方案:
方法一:使用正則表達式(輕量級方案)
適用于簡單 Markdown 內(nèi)容的快速轉(zhuǎn)換
import java.util.regex.Pattern; public class MarkdownToText { // 定義 Markdown 常見語法正則表達式 private static final Pattern[] MARKDOWN_PATTERNS = { Pattern.compile("\\[(.*?)\\]\\(.*?\\)"), // 鏈接 [text](url) Pattern.compile("!\\[.*?\\]\\(.*?\\)"), // 圖片  Pattern.compile("`{3,}[\\s\\S]*?`{3,}"), // 代碼塊 ```code``` Pattern.compile("`(.+?)`"), // 行內(nèi)代碼 `code` Pattern.compile("^[#]{1,6}\\s*"), // 標題 # ## ### Pattern.compile("\\*{1,2}(.*?)\\*{1,2}"), // 加粗/斜體 *text* Pattern.compile("~{2}(.*?)~{2}"), // 刪除線 ~~text~~ Pattern.compile("^\\s*[-*+]\\s", Pattern.MULTILINE), // 無序列表項 Pattern.compile("^\\s*\\d+\\.\\s", Pattern.MULTILINE) // 有序列表項 }; public static String convertToText(String markdown) { if (markdown == null || markdown.isEmpty()) return ""; // 逐步替換所有 Markdown 語法 String text = markdown; for (Pattern pattern : MARKDOWN_PATTERNS) { text = pattern.matcher(text).replaceAll("$1"); } // 處理換行和多余空格 return text.trim() .replaceAll("\n{3,}", "\n\n") // 多個空行合并為兩個 .replaceAll(" {2,}", " "); // 多個空格合并為一個 } public static void main(String[] args) { String md = "# Hello World!\n" + "This is **bold** and *italic* text.\n" + "[Link](https://example.com)"; System.out.println(convertToText(md)); /* 輸出: Hello World! This is bold and italic text. Link */ } }
優(yōu)點:零依賴、輕量快速
缺點:無法處理復(fù)雜嵌套結(jié)構(gòu)
方法二:使用 Flexmark-java 庫(專業(yè)方案)
推薦用于處理復(fù)雜 Markdown 文檔
1. 添加依賴(Maven)
<dependency> <groupId>com.vladsch.flexmark</groupId> <artifactId>flexmark-all</artifactId> <version>0.64.8</version> </dependency>
運行 HTML
2. 轉(zhuǎn)換代碼實現(xiàn)
import com.vladsch.flexmark.ast.Node; import com.vladsch.flexmark.ext.gfm.tables.TablesExtension; import com.vladsch.flexmark.html.HtmlRenderer; import com.vladsch.flexmark.parser.Parser; import com.vladsch.flexmark.util.data.MutableDataSet; import org.jsoup.Jsoup; import java.util.Arrays; public class MarkdownToTextPro { public static String convert(String markdown) { if (markdown == null || markdown.isEmpty()) return ""; // 配置解析器(支持表格等擴展) MutableDataSet options = new MutableDataSet(); options.set(Parser.EXTENSIONS, Arrays.asList(TablesExtension.create())); // 構(gòu)建解析器和渲染器 Parser parser = Parser.builder(options).build(); HtmlRenderer renderer = HtmlRenderer.builder(options).build(); // 將 Markdown 解析為 HTML Node document = parser.parse(markdown); String html = renderer.render(document); // 使用 JSoup 去除 HTML 標簽 return Jsoup.parse(html).text() .replaceAll("\\s+", " ") // 合并多余空格 .trim(); } public static void main(String[] args) { String md = "| Tables | Are | Cool |\n" + "|----------|:-------------:|------:|\n" + "| col 1 is | left-aligned | $1600 |\n" + "| col 2 is | centered | $12 |"; System.out.println(convert(md)); /* 輸出: Tables Are Cool col 1 is left-aligned $1600 col 2 is centered $12 */ } }
優(yōu)點:
- 準確處理復(fù)雜結(jié)構(gòu)(表格、嵌套列表等)
- 保留內(nèi)容邏輯順序
- 支持 Markdown 擴展語法
方案對比
特性 | 正則方案 | Flexmark 方案 |
---|---|---|
依賴項 | 無 | 需要引入 JAR |
處理速度 | 極快 | 較快 |
語法支持 | 基礎(chǔ)語法 | 完整語法+擴展 |
代碼復(fù)雜度 | 簡單 | 中等 |
處理嵌套結(jié)構(gòu)能力 | 有限 | 優(yōu)秀 |
輸出可讀性 | 一般 | 優(yōu)秀 |
使用建議
簡單內(nèi)容處理:如果只需要處理標題、鏈接等基礎(chǔ)語法,選擇正則方案
復(fù)雜文檔轉(zhuǎn)換:如果需要處理表格、代碼塊、數(shù)學(xué)公式等復(fù)雜內(nèi)容,使用 Flexmark 方案
保留格式結(jié)構(gòu):若需要保留段落換行等格式,可調(diào)整正則方案中的換行處理邏輯
對于需要更高精度的轉(zhuǎn)換,可以結(jié)合兩種方法:先用 Flexmark 轉(zhuǎn)換,再通過正則處理特殊字符。
到此這篇關(guān)于Java實現(xiàn)將Markdown轉(zhuǎn)換為純文本的文章就介紹到這了,更多相關(guān)Java Markdown轉(zhuǎn)純文本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Sentinel結(jié)合Nacos實現(xiàn)數(shù)據(jù)持久化過程詳解
這篇文章主要介紹了Sentinel結(jié)合Nacos實現(xiàn)數(shù)據(jù)持久化過程,要持久化的原因是因為每次啟動Sentinel都會使之前配置的規(guī)則就清空了,這樣每次都要再去設(shè)定規(guī)則顯得非常的麻煩,感興趣想要詳細了解可以參考下文2023-05-05詳解使用Spring Security OAuth 實現(xiàn)OAuth 2.0 授權(quán)
本篇文章主要介紹了詳解使用Spring Security OAuth 實現(xiàn)OAuth 2.0 授權(quán),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01泛談Java中的不可變數(shù)據(jù)結(jié)構(gòu)
開發(fā)人員通常認為擁有final引用,或者val在Kotlin或Scala中,足以使對象不可變。這篇博客文章深入研究了不可變引用和不可變數(shù)據(jù)結(jié)構(gòu),下面小編來和大家一起學(xué)習(xí)它2019-05-05