当前位置: 首页 > news >正文

java读取Markdown配置文件

之前的文章中自定义实现过一个简单的状态机, 以前想的是读取json文件, 这样读起来更方便一点, 但是后来发现过于复杂的流程如果还是用json文件作为配置文件的话就比较麻烦了, 因此, 我们需要更直观地配置文件, 正好markdown能够完美满足我们的需求

Markdown

Markdown语法比较简单, 这样读起来也比较方便, 我们可以先设置一个简单的流程图, 此处我使用IDEA直接编辑的, 使用IDEA画流程图需要安装一个插件

如果画的流程图没有加载出来, 可以在确认插件安装成功后重启IDEA即可正常加载出来

制作流程图

markdown语法可以自行百度, 这是最简单的一个流程图

## 简单流程图
```mermaid
graph TD
    A --提交--> B
    B --驳回--> C
    B --通过--> D
```

 

读取Markdown

这里主要用到的是正则表达式来匹配Markdown的配置, 相当于我们自己指定了一个规则

这里是将读取到的配置写进了Table中, 需要引入guava依赖

<dependency>
       <groupId>com.google.guava</groupId>
       <artifactId>guava</artifactId>
       <version>31.1-jre</version>
   </dependency>
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MermaidParser {

    public static void main(String[] args) {
        String filePath = "配置文件路径";
        Table<String, String, String> table = parseMermaid(filePath);
        System.out.println(table);
    }

    public static Table<String, String, String> parseMermaid(String filePath) {
        Table<String, String, String> table = HashBasedTable.create();
        try {
            // 1. 读取文件内容
            String content = Files.readString(Paths.get(filePath));

            // 2. 提取mermaid代码块(使用非贪婪匹配)
            Pattern mermaidPattern = Pattern.compile("```mermaid\\n([\\s\\S]*?)\\n```");
            Matcher mermaidMatcher = mermaidPattern.matcher(content);
            if (mermaidMatcher.find()) {
                String mermaidCode = mermaidMatcher.group(1);

                // 3. 解析每一行(允许节点包含空格)
                Pattern edgePattern = Pattern.compile("(.+?)\\s+--(.+?)-->\\s*(.+)");  // 关键修改点
                for (String line : mermaidCode.split("\\n")) {
                    line = line.trim();
                    Matcher m = edgePattern.matcher(line);
                    if (m.find()) {
                        String from = m.group(1).trim();
                        String label = m.group(2).trim();
                        String to = m.group(3).trim();
                        table.put(from, label, to);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return table;
    }
}

相关文章:

  • 【2025前端高频面试题——系列二之vue生命周期:vue2/vue3】
  • 【量化交易笔记】15.因子的来源和生成
  • FX-C++结构体与类的区别
  • 英语-新概念-第三册
  • 基于PyTorch的深度学习3——非标量反向传播
  • 轻量级TCC框架的实现
  • c++中的数学函数库(少)
  • 基于策略模式的智能提示语生成器设计与实现——以Tkinter GUI开发为例
  • 软考 中级软件设计师 考点知识点笔记总结 day02
  • AI赋能零代码编程基石:Anaconda全栈环境搭建与避坑指南
  • Golang | Gin(简洁版)
  • 深入Flink运行时架构:JobManager与TaskManager协作全解析
  • numpy常用函数详解
  • vulnhub靶场之【digitalworld.local系列】的FALL靶机
  • Java中,BIO、NIO和AIO三种模型的区别和适用场景
  • scala类型检测和转换
  • 1、stc89C52单片机简单使用
  • Linux基础操作
  • 每周一个网络安全相关工具——MetaSpLoit
  • 使用阿里云操作系统控制台排查内存溢出
  • 天长做网站的/宁波seo推广推荐
  • 网站建设及维护机/舆情监控
  • 怎么做bbs论坛网站/51网站统计
  • wordpress设置背景图案/seo网络优化平台
  • 国外做彩票网站推广是合法的吗/做百度推广多少钱
  • 注册完域名 如何做网站/哪些平台可以做推广