生成能匹配指定正则的字符串

问题背景

在类似MockServer的项目中,有一些需求希望能按照用户指定的规则随机生成响应内容。想自主开发一套易用、易扩展的规则模块,对前端后端来说都是不小的开发量。
而正则表达式功能强大,可满足大部分自定义规则的场景。可以很大程度上降低系统复杂度和开发工作量,正适合用来完成这一目标。因此有了“反向生成能匹配指定正则的字符串” 这一需求。

第三方支持

经调查了解,现有的工具较难满足需求。根据正则表达式反向生成对应的字符串现有工具(包)总结中收集的全面。
按照博主所列,尝试了Java的 Xeger, Generex。Python的Xeger。发现Java的如上两个工具在解析 *, + 的表达式时容易出现栈溢出,且不支持包含\d等元字符的表达式。而Python的Xeger支持较好。因此在继续寻找Java的第三方工具的同时,在考虑通过Java调用Python的Xeger。(自己写是不可能自己写的,时间精力都不允许…)
后下载Java Xeger查看其源码,发现其内部逻辑较简单,易改造。
Java Xeger主要通过dk.brics.automaton的依赖实现功能,而该自动机已经支持构造指定正则的状态自动机。

解决方案

Java Xeger中的实现逻辑是:针对一个正则构造状态机,而后在状态机中随机选择下一状态,将随机选择的结果添加到字符串中,以此构建符合正则的字符串。
其不支持*的原因是,当可选的路径足够多,例如表达式为[a-zA-Z0-9_-]*时,假设程序是真正的随机挑选,每次只有 1/(26 + 26 + 10 + 2 + 1) 的可能能够结束本次生成。一旦正则表达式中使用了多个类似的语法,递归实现的选路方法很容易栈溢出。
其不支持\d的原因是,dk.brics.automaton的正则解析未支持。
得到如上结论后,很容易对其修改使其支持常用的正则。
对*,+的问题,可以将此类量词替换成{m, n}的语法,毕竟在正常需求中,有较明确的长度限制也是合理的。
对于 \d \s \w等转义元字符,可替换成等价/近似的[]语法。需要注意的是替换过程中不能破坏语法

代码

简单正则的支持已经满足需求,有时间再整理完善

你可能感兴趣的:(Java相关)