You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何移除Markdown语法并提取纯文本?

在Flutter中移除字符串中的Markdown语法

目前markdown、flutter_markdown这类包确实没有专门提供移除Markdown语法的现成功能,你完全可以通过编写Dart正则函数来将Markdown转换为纯文本。

你的实现已经覆盖了粗体、斜体、删除线、行内代码、代码块这些常见Markdown元素,但确实存在不少遗漏的场景,很多常用Markdown语法还没处理。

你的方法遗漏的常见场景

  • 标题(# 一级标题、## 二级标题等)
  • 链接([文本](链接地址))
  • 图片(![alt文本](图片地址))
  • 无序列表/有序列表(- 列表项、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)
![图片alt](https://example.com/img.jpg)
`行内代码`

代码块内容

$单行公式$
$$
多行公式
$$
---
""";
  print(removeMarkdown(testMarkdown));
}

额外说明

  • 正则表达式无法覆盖所有极端的Markdown嵌套场景(比如多层嵌套的格式标签、复杂表格等),如果需要处理非常复杂的Markdown内容,建议考虑先将Markdown解析为AST(抽象语法树),再遍历节点提取纯文本——比如借助markdown包的解析能力来实现。
  • 上面的正则已经覆盖了绝大多数日常使用的Markdown场景,足以满足普通需求下的转纯文本需求。

内容的提问来源于stack exchange,提问作者B0r1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:03:01