Java實現(xiàn)將Markdown轉換為純文本
以下是兩種在 Java 中實現(xiàn) Markdown 轉純文本的主流方法,根據(jù)需求選擇適合的方案:
方法一:使用正則表達式(輕量級方案)
適用于簡單 Markdown 內(nèi)容的快速轉換
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)點:零依賴、輕量快速
缺點:無法處理復雜嵌套結構
方法二:使用 Flexmark-java 庫(專業(yè)方案)
推薦用于處理復雜 Markdown 文檔
1. 添加依賴(Maven)
<dependency>
<groupId>com.vladsch.flexmark</groupId>
<artifactId>flexmark-all</artifactId>
<version>0.64.8</version>
</dependency>
運行 HTML
2. 轉換代碼實現(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()));
// 構建解析器和渲染器
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)點:
- 準確處理復雜結構(表格、嵌套列表等)
- 保留內(nèi)容邏輯順序
- 支持 Markdown 擴展語法
方案對比
| 特性 | 正則方案 | Flexmark 方案 |
|---|---|---|
| 依賴項 | 無 | 需要引入 JAR |
| 處理速度 | 極快 | 較快 |
| 語法支持 | 基礎語法 | 完整語法+擴展 |
| 代碼復雜度 | 簡單 | 中等 |
| 處理嵌套結構能力 | 有限 | 優(yōu)秀 |
| 輸出可讀性 | 一般 | 優(yōu)秀 |
使用建議
簡單內(nèi)容處理:如果只需要處理標題、鏈接等基礎語法,選擇正則方案
復雜文檔轉換:如果需要處理表格、代碼塊、數(shù)學公式等復雜內(nèi)容,使用 Flexmark 方案
保留格式結構:若需要保留段落換行等格式,可調整正則方案中的換行處理邏輯
對于需要更高精度的轉換,可以結合兩種方法:先用 Flexmark 轉換,再通過正則處理特殊字符。
到此這篇關于Java實現(xiàn)將Markdown轉換為純文本的文章就介紹到這了,更多相關Java Markdown轉純文本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Sentinel結合Nacos實現(xiàn)數(shù)據(jù)持久化過程詳解
這篇文章主要介紹了Sentinel結合Nacos實現(xiàn)數(shù)據(jù)持久化過程,要持久化的原因是因為每次啟動Sentinel都會使之前配置的規(guī)則就清空了,這樣每次都要再去設定規(guī)則顯得非常的麻煩,感興趣想要詳細了解可以參考下文2023-05-05
詳解使用Spring Security OAuth 實現(xiàn)OAuth 2.0 授權
本篇文章主要介紹了詳解使用Spring Security OAuth 實現(xiàn)OAuth 2.0 授權,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01

