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)點:零依賴、輕量快速
缺點:無法處理復雜嵌套結(jié)構(gòu)
方法二:使用 Flexmark-java 庫(專業(yè)方案)
推薦用于處理復雜 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)點:
- 準確處理復雜結(jié)構(gòu)(表格、嵌套列表等)
- 保留內(nèi)容邏輯順序
- 支持 Markdown 擴展語法
方案對比
| 特性 | 正則方案 | Flexmark 方案 |
|---|---|---|
| 依賴項 | 無 | 需要引入 JAR |
| 處理速度 | 極快 | 較快 |
| 語法支持 | 基礎(chǔ)語法 | 完整語法+擴展 |
| 代碼復雜度 | 簡單 | 中等 |
| 處理嵌套結(jié)構(gòu)能力 | 有限 | 優(yōu)秀 |
| 輸出可讀性 | 一般 | 優(yōu)秀 |
使用建議
簡單內(nèi)容處理:如果只需要處理標題、鏈接等基礎(chǔ)語法,選擇正則方案
復雜文檔轉(zhuǎn)換:如果需要處理表格、代碼塊、數(shù)學公式等復雜內(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)文章
spring cloud gateway中redis一直打印重連日志問題及解決
這篇文章主要介紹了spring cloud gateway中redis一直打印重連日志問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
Java數(shù)據(jù)結(jié)構(gòu)之復雜度篇
算法復雜度分為時間復雜度和空間復雜度。其作用:?時間復雜度是度量算法執(zhí)行的時間長短;而空間復雜度是度量算法所需存儲空間的大小2022-01-01
Mybatis實現(xiàn)批量更新數(shù)據(jù)(批量update)
本文介紹了MyBatis批量更新數(shù)據(jù)的兩種方案,方案一使用foreach標簽拼接多條update語句,通過在數(shù)據(jù)庫連接URL中指定allowMultiQueries參數(shù)值為true來支持多條語句的執(zhí)行,提高效率;方案二拼接成一條SQL,但SQL語句會非常復雜且難以閱讀,不推薦使用2026-04-04
SpringBoot整合GitLab-CI實現(xiàn)持續(xù)集成的過程
這篇文章主要介紹了SpringBoot整合GitLab-CI實現(xiàn)持續(xù)集成,本文詳細講述了 GitLab-CI 持續(xù)集成的安裝、部署、以及配置,需要的朋友可以參考下2022-12-12
關(guān)于IDEA2020.1新建項目maven PKIX 報錯問題解決方法
這篇文章主要介紹了關(guān)于IDEA2020.1新建項目maven PKIX 報錯問題解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06
SpringBoot接收參數(shù)所有方式總結(jié)
這篇文章主要介紹了SpringBoot接收參數(shù)所有方式總結(jié),文中通過代碼示例和圖文結(jié)合的方式給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-07-07
Java線程和操作系統(tǒng)線程的關(guān)系解讀
這篇文章主要介紹了Java線程和操作系統(tǒng)線程的關(guān)系解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06

