Flutter中如何移除Markdown语法并提取纯文本?
在Flutter中移除字符串中的Markdown语法
目前markdown、flutter_markdown这类包确实没有专门提供移除Markdown语法的现成功能,你完全可以通过编写Dart正则函数来将Markdown转换为纯文本。
你的实现已经覆盖了粗体、斜体、删除线、行内代码、代码块这些常见Markdown元素,但确实存在不少遗漏的场景,很多常用Markdown语法还没处理。
你的方法遗漏的常见场景
- 标题(
# 一级标题、## 二级标题等) - 链接(
[文本](链接地址)) - 图片(
) - 无序列表/有序列表(
- 列表项、1. 列表项) - 引用(
> 引用文本) - 数学公式(
$公式$或$$公式$$) - 水平线(
---、***)
完善后的移除Markdown方法
String removeMarkdown(String markdown) { // 处理粗体 markdown = markdown.replaceAll(RegExp(r"\*\*(.+?)\*\*"), r"\1"); // 处理斜体(兼容*或_包裹的情况) markdown = markdown.replaceAll(RegExp(r"(\*|_)(.+?)\1"), r"\2"); // 处理删除线 markdown = markdown.replaceAll(RegExp(r"~~(.+?)~~"), r"\1"); // 移除行内代码(保留代码内容) markdown = markdown.replaceAll(RegExp(r"`(.+?)`"), r"\1"); // 移除代码块 markdown = markdown.replaceAll(RegExp(r"```[\s\S]*?```", multiLine: true), ""); // 移除标题符号(保留标题文本) markdown = markdown.replaceAll(RegExp(r"^#{1,6}\s+", multiLine: true), ""); // 移除链接(仅保留链接文本) markdown = markdown.replaceAll(RegExp(r"\[(.*?)\]\(.*?\)"), r"\1"); // 移除图片(仅保留alt文本) markdown = markdown.replaceAll(RegExp(r"!\[(.*?)\]\(.*?\)"), r"\1"); // 移除列表符号 markdown = markdown.replaceAll(RegExp(r"^(\-|\*|\+|\d+\.)\s+", multiLine: true), ""); // 移除引用符号 markdown = markdown.replaceAll(RegExp(r"^>\s+", multiLine: true), ""); // 移除数学公式(保留公式内容) markdown = markdown.replaceAll(RegExp(r"\${1,2}([\s\S]*?)\${1,2}"), r"\1"); // 移除水平线 markdown = markdown.replaceAll(RegExp(r"^(\-{3,}|\*{3,}|_{3,})$", multiLine: true), ""); // 清理多余的空行 markdown = markdown.replaceAll(RegExp(r"\n{2,}", multiLine: true), "\n"); return markdown.trim(); } void main() { String testMarkdown = """ # 这是一级标题 ## 二级标题 - 无序列表项1 1. 有序列表项1 > 这是引用文本 **粗体** *斜体* ~~删除线~~ [链接文本](https://example.com)  `行内代码`
代码块内容
$单行公式$ $$ 多行公式 $$ --- """; print(removeMarkdown(testMarkdown)); }
额外说明
- 正则表达式无法覆盖所有极端的Markdown嵌套场景(比如多层嵌套的格式标签、复杂表格等),如果需要处理非常复杂的Markdown内容,建议考虑先将Markdown解析为AST(抽象语法树),再遍历节点提取纯文本——比如借助
markdown包的解析能力来实现。 - 上面的正则已经覆盖了绝大多数日常使用的Markdown场景,足以满足普通需求下的转纯文本需求。
内容的提问来源于stack exchange,提问作者B0r1
相关产品推荐
相关产品推荐

