字符串随机生成工具(开源)-Kimen(奇门)

        由于最近笔者在开发数据脱敏相关功能,其中一类脱敏需求为能够按照指定的格式随机生成一个字符串来代替原有信息,数据看起来格式需要与原数据相同,如:电话号码,身份证号以及邮箱等。在网上搜索了下,发现没有特别合适的开源工具,于是秉承着没有开源就自己写的宗旨。笔者开发了一个小的开源工具--Kimen(奇门)。这个工具可以按照给定的表达式随机生成字符串,简单易用。项目代码不多,但用到了些编程技巧,如:antlr的使用。但更多是对解决这个字符串随机生成问题的设计思考。如果感兴趣的朋友多的话,文章下留言,笔者将在后续整理出Kimen从构思到开发的过程。好了,闲话少叙,介绍Kimen(奇门)。

        KiMen(奇门)是一款基于表达式随机生成字符串的开源工具。可用于数据脱敏或系统测试时数据的仿真生成,还可用作随机密码生成的场景。其表达式借鉴了正则表达式的部分表示方式,如:

[a-zA-Z]{4}'1234'[a-zA-Z]{4}

        该表达式由三部分组成,分别是:[a-zA-Z]{4}、'1234'和[a-zA-Z]{4}。[a-zA-Z]{4}描述了一个可变字符串,该字符串长度为4,可用字符范围为'a'到'z'和'A'到'Z';'1234'描述了一个常量字符串,该字符串在进行字符串随机生成时保持不变。以下几个示例为由该表达式随机生成的字符串:

oOVj1234sCin
ygfj1234Zcdj
zpJM1234Zjmp
......

KiMen表达式

        Kimen表达式主要由两类任意多个基本的子表达式组成,格式如下:

(VariantStrExpr|ConstantStrExpr)+
VariantStrExpr

        表示可变字符串。Kimen将根据该表达式随机生成字符串。其格式如下:

'['charset']''{'min[,max]'}'

        [charset]中描述了进行字符串随机生成时可用的字符。可用字符集两端使用'[]'包围,其字符描述包括以下三种格式:

  1. 字符:如:[abcd],abcd四个字符间不需要任何分隔符。

  2. 字符区间:[0-9],0-9表示从数字0到数字9

  3. 字符字典:[\a],\a表示一个名字为a的字典,Kimen中所有的字符集字典都以一个字符命名。其可用的命名字符的范围没有限制,理论上你可以使用除[\|'|"]号外的任何一个字符为字典命名。字符字典主要用于可选字符范围较大,在表达式中展开不方便的情况。字符字典,可通过Kimen的开发接口进行注册,字符串生成器会动态装载字符字典。字符字典可以让Kimen表达式看起来更清爽一些。'\'字符为转义字符,当碰到该字符时表示,其后面的字符是字典名。需要额外注意的是,当需要在表达式中使用'\'字符时,需要用两个'\\'字符来表达。

        {min,max}中描述了可变字符串的长度,min表示随机生成字符串时的最小长度; max表示随机生成字符串时的最大长度,max可选。当只有min值时,表示按照固定长度生成字符串。

ConstantStrExpr

        表示常量字符串。常量字符串用于描述字符串随机生成时,信息相对固定的部分。其表达格式如下:

'str'|"str"

        如表达式所示,其有两种常量字符串格式:

        'str'使用[']号做为常量字符串的包围符,其内部可以是除[']号外的任意字符,当需要在常量字符串中使用'''字符时,可使用[\']或[''] (两个连续单引号)两种格式表达。

        "str"使用["]号做为常量字符串的包围符,其内部可以是除["]号外的任意字符,当需要在常量字符串中使用["]字符时,可使用[\"]表达。

KiMen代码示例

随机变长字符串示例
    // 随机字符串表达式
    String expr = "[a-zA-Z]{4}'1234'[a-zA-Z]{4,8}";
    KimenBuilder kimenBuilder = new KimenBuilder();
    // 构造字符串生成器
    StringGenerator stringGenerator = kimenBuilder.buildKimen(expr);
    // 循环输出生成的字符串
    for (int i = 0; i < 10; i++) {
      System.out.println(stringGenerator.generate());
    }

生成结果

SKDZ1234ODPC
NUvi1234dkYFvaJ
fAQJ1234KXJsbR
evZz1234ZUIvaLm
uHpi1234UPHlZH
AXQB1234KfUCwd
PuoR1234BeRBrR
NudR1234RSqoZM
SYpf1234wxEumY
slZK1234RPviU
字符字典示例
    // 随机字符串表达式
    String expr = "[a-zA-Z]{4}\"1234\"[\\a\\d]{4}";
    KimenBuilder kimenBuilder = new KimenBuilder();
    // 设置字符字典a
    kimenBuilder.addCharSet('a',"bcd");
    // 设置字符字典d
    kimenBuilder.addCharSet('d',"123");
    // 构造字符串生成器
    StringGenerator stringGenerator = kimenBuilder.buildKimen(expr);
    // 循环输出生成的字符串
    for (int i = 0; i < 10; i++) {
      System.out.println(stringGenerator.generate());
    }

生成结果

rVQk1234dc33
HReP1234dcd1
dEyi12342dd2
hmaT1234322b
irsl12343dd2
vNDx1234c3dd
pfeW1234dbc1
rvlV1234211b
vEzz12341cc3
ndWD123412bd

Maven坐标

<dependency>
    <groupId>org.datayoo.kimen</groupId>
    <artifactId>kimen</artifactId>
    <version>1.0.0</version>
</dependency>


http://www.niftyadmin.cn/n/5346943.html

相关文章

代码随想录算法训练营29期Day30|LeetCode 332,51,37

文档讲解&#xff1a;回溯算法总结篇 重新安排行程 N皇后 解数独 51.N皇后 题目链接&#xff1a;https://leetcode.cn/problems/permutations/description/ 思路&#xff1a; 本题的基本含义就是有个N*N的棋盘&#xff0c;需要我们放N个皇后在上面&#xff0c;满足不能有任…

【Linux C | 进程】进程终止、等待 | exit、_exit、wait、waitpid

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

ORM-08-EclipseLink 入门介绍

拓展阅读 The jdbc pool for java.(java 手写 jdbc 数据库连接池实现) The simple mybatis.&#xff08;手写简易版 mybatis&#xff09; 1. EclipseLink概述 本章介绍了EclipseLink及其关键特性&#xff1a;包括在EclipseLink中的组件、元数据、应用程序架构、映射和API。 本…

【Unity】粒子贴图异常白边问题

从PS制作的黑底&#xff0c;白光的贴图。放入Unity粒子中&#xff0c;拉远看会有很严重的白边&#xff0c;像马赛克一样。 材质使用&#xff1a;Mobile/Particles/Additive 经测试只使用一张黑色的图片&#xff0c;也会有白边。 解决方案&#xff1a; 关闭黑色底&#xf…

如何设计一个可靠UDP

背景 通信领域存在制约三角&#xff1a;时延&#xff0c;成本和质量。TCP是增大时延和成本来保证通信质量&#xff0c;UDP牺牲了质量保证了时延和成本。一定场景使用RDP可以找到这三之间的平衡点。实现可靠UDP主要有三种方式&#xff1a; 尽力可靠&#xff1a;接收方要求发送…

cartopy在地图中添加经纬线

文章目录 gridlines方法定义 gridlines gridlines可以根据坐标系&#xff0c;自动绘制网格线&#xff0c;这对于普通绘图来说显然不必单独拿出来说说&#xff0c;但在地图中&#xff0c;经纬线几乎是必不可少的&#xff0c;而随着投影方式的不同&#xff0c;经纬线未必与坐标框…

如何荒废你的2024?

这个演讲题目出人意料&#xff0c;当大家都在想着如何才能获得幸福、快乐、成功的时候&#xff0c;芒格却在跟我们讲“如何获得痛苦&#xff1f;” 为什么&#xff1f; 因为只有知道了自己不想过怎样的生活&#xff0c;才能想尽办法避免它&#xff1b;同样&#xff0c;也只有…

springboot 优雅使用函数式编程处理 websocket @OnMessage 消息

背景 现在大多业务功能使用 socket.io实现长连接&#xff0c;但是部分第三方设备对接 只支持基础的websocket。 spring中使用基础的websocket, OnMessage 收到消息&#xff0c;对消息的处理&#xff0c;if else 将会繁琐&#xff0c;难以维护。 本文仅介绍了如何使用enum枚举、…