基本上Mock数据的库,都会有支持使用正则表达式来mock字符串的库,suchjs也一样。
由于这个功能本身具有很大的独立性,所以单独提成一个库也非常常见。JS里实现类似功能的库已经有不少,比较流行的比如 randexp,看其测试覆盖率已经达到100%,是一个测试良好的库。
但这些库比如 randexp,开发时间比较偏早,导致有些功能支持得不是很全。对于suchjs而言,有个很重要的设计就是,有时候需要对一些匹配分组进行预设定,从而针对同一个正则表达式,不同的分组配置能生成不同的结果。这一点 randexp 显然是无法满足的,首先,randexp 不支持对某个分组预设定值;其次,randexp 也没有对最新的命名分组语法做支持。举个例子来说:
var mockRule = /(http|https):\/\//;
// 这里针对第一个分组,我想配置某些情况下,只匹配出 http 或者 https
// 这在 randexp 这类的库里是没法实现的
// 在reregexp库里实现了该功能
// 首先在reregexp里,实现命名表达式语法的解析
// 其次,在配置里支持了 namedGroupConf 配置
var mockRule = new ReRegExp('/(?<protocol>http|https):\\/\\//', {
namedGroupConf: {
// 会用该配置列表中的值强制替换分组中的值
// 同时还会校验值是否符合分组的正则语法
'protocol': ['http']
}
});
另外,randexp 里也不支持最新的 u
unicode flag,从而 /\u{4e00}/
这种类似的语法写法无法得到支持。这些都是导致我决定自己开发一个正则模拟库的原因。在这个库 reregexp
里,对正则表达式的语法解析对各种边界语法处理都完全按照js正则本身的规则进行了实现,所以它具备了比 randexp 更完备更强大的功能,更多的功能细节可以在 https://github.com/suchjs/reregexp github上可以看到,希望它能给如同我一样有类似需求的人带来一些帮助,如果你恰好用得到欢迎star和提issue。