成都电子商城网站开发济南网站建设老威
之前的文章中自定义实现过一个简单的状态机, 以前想的是读取json文件, 这样读起来更方便一点, 但是后来发现过于复杂的流程如果还是用json文件作为配置文件的话就比较麻烦了, 因此, 我们需要更直观地配置文件, 正好markdown能够完美满足我们的需求
Markdown
Markdown语法比较简单, 这样读起来也比较方便, 我们可以先设置一个简单的流程图, 此处我使用IDEA直接编辑的, 使用IDEA画流程图需要安装一个插件
如果画的流程图没有加载出来, 可以在确认插件安装成功后重启IDEA即可正常加载出来
制作流程图
markdown语法可以自行百度, 这是最简单的一个流程图
## 简单流程图
```mermaid
graph TDA --提交--> BB --驳回--> CB --通过--> 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;}
}