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

在MockServer项目中,为了简化规则模块并降低开发工作量,提出了根据正则表达式反向生成字符串的需求。经过调查,发现Java的Xeger和Generex在处理某些正则时存在局限,而Python的Xeger支持更好。通过分析Java Xeger的源码,了解到其工作原理,并提出了改进方案,包括处理*和+量词以及支持d等元字符的方法。目前,简单的正则表达式支持已经可以满足需求。

问题背景

在类似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.a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值