根据规则自动生成正则表达式

本文介绍了一种通过输入数据自动生成正则表达式的算法。该算法能够处理不同范围的数字,并生成相应的正则表达式用于验证。针对0到999等特定范围,文章详细解释了如何构建合适的正则表达式,包括考虑位数一致性和范围限制。

是要在规定的规则里输入数据自动生成正则验证。

主要思路:遍历,判断 找范围正则验证规律例如(1-800)(001-800)(001-006)写递归

难点  :范围验证需要找不同的规律 例如

0到999范围的正则表达式分为三部分,

  1. 0至9

  2. 10至99

  3. 100至999 

以及范围验证生成正则表达式是,位数要一样,后面要比前面大,双范围等等

先上效果图

 

首先给的规则是

@代表大写字母,*代表数字,%代表通配任意数字或大写字母仅限首尾,$代表任意数字或大写字母  (提示%号不能相邻,不能有两个百分号,只能在首尾,只能是大小写,提示范围必须后面大于前面,个位数必须补足位数输入)

直接上代码

初始是这样写的,但是后面发现很不严谨,范围有很大的问题

 

 下面经过完善是要先先获取区间

思路(获取第一个文本框的() 根据位数判断大小)

(自己建的页面,控件命名还未改)截图截不下了,直接复制代码吧


string ToQuJian(string min, string max)
        {
            StringBuilder res = new StringBuilder("");
            int sub = int.Parse(max) - int.Parse(min);
            int temp1 = int.Parse(min);
            int temp2 = int.Parse(max);
            min = min.PadLeft(max.Length, '0');
            int sumZero = max.Length - min.TrimStart('0').Length;
            char[] minArray = min.ToArray();
            char[] maxArray = max.ToArray();
            if (temp1 < 10)
            {
                if (temp2 == 0)
                    return max;
                else if (temp2 < 10)
                    return $"{"".PadLeft(max.Length - 1, '0')}[{temp1}-{temp2}]";
                else
                {
                    res.Append($"{"".PadLeft(max.Length - (SubTen(temp2) - 1).ToString().Length, '0')}{ToQuJian(temp1.ToString(), (SubTen(temp2) - 1).ToString())}|");

                    res.Append($"{ToQuJian(SubTen(temp2).ToString(), max)}");

                }
                return res.ToString();
            }
            else if (sumZero > 0)
            {
                res.Append("".PadLeft(sumZero, '0') + "(" + minZeroalgorithm(temp1, 10 * SubTen(temp1) - 1) + ")|");
                if (10 * SubTen(temp1) < temp2 / SubTen(temp2) * SubTen(temp2) - 1)
                    res.Append($"{ToQuJian((10 * SubTen(temp1)).ToString(), (temp2 / SubTen(temp2) * SubTen(temp2) - 1).ToString())}|");
                res.Append(minZeroalgorithm(temp2 / SubTen(temp2) * SubTen(temp2), temp2));
            }
            else
                res.Append(minZeroalgorithm(temp1, temp2));
            return res.ToString();
        }

        int SubTen(int sub)
        {
            int res = 1;
            if (sub / 10 > 0)
                res = 10 * SubTen(sub / 10);
            else
                res = 1;
            return res;
        }

        string minZeroalgorithm(int min, int max)
        {
            StringBuilder res = new StringBuilder("");
            if (min == max)
                res.Append($"{min}");
            else if (min < 10)
            {
                res.Append($"[{min}-{max}]");
            }
            else if (min % SubTen(min) == 0 && (max + 1) % (SubTen(max) * 10) == 0)
            {
                res.Append($"[{min / SubTen(min)}-{max / SubTen(max)}][0-9]{{{max.ToString().Length - 1}}}");
            }
            else
            {
                int StartNum = int.Parse(min.ToString().Substring(0, 1));
                int StartNumMax = int.Parse(max.ToString().Substring(0, 1));
                int Sub = SubTen(min);
                int length = 0;
                for (int i = Sub; i >= 1; i /= 10)
                {
                    if (min / i == max / i)
                        length++;
                    else
                        break;
                }
                if (length > 0)
                {
                    res.Append($"{min.ToString().Substring(0, length)}({ToQuJian(min.ToString().Substring(1, min.ToString().Length - 1), max.ToString().Substring(1, max.ToString().Length - 1))})");
                }
                else
                {
                    res.Append($"{StartNum}({ToQuJian((min % Math.Pow(10, min.ToString().Length - length - 1)).ToString(), (1 * Sub - 1).ToString())})|");
                    if (Sub > 10 || max % 10 != 9)
                    {
                        if (StartNum + 1 != StartNumMax)
                        {
                            res.Append($"[{StartNum + 1}-{StartNumMax - 1}][0-9]{{{min.ToString().Length - 1}}}|");
                        }
                        res.Append($"{StartNumMax}({ToQuJian("0", max.ToString().Substring(1, max.ToString().Length - 1))})");
                    }
                    else
                    {
                        res.Append($"[{StartNum + 1}-{StartNumMax}][0-9]");
                    }

                }
            }
            return res.ToString();
        }

 这边调用上面两个主方法,获取区间,进行输入限制判断

 

 最后单例调用

 

正则表达式自动生成器是一个智能、易用的正则表达式生成、测试以及字符串提取工具。正则表达式库让你可以直接借用正则表达式,而无需自己费脑筋。“正则表达式自动生成器”可以自动生成正则表达式,测试正则表达式,可视化显示结果,导出提取字符串,你所要做的,仅仅是几下鼠标点击! 正则表达式自动生成器主要功能: 自动生成正则表达式 编辑并测试正则表达式 多向导页,可在多个源文本上测试同一个正则表达式(标准版无此功能) 多页参考生成正则表达式(标准版无此功能) 自动检查和修改生成的正则表达式的正确性 以可视方式呈现测试结果 从文本文件中获取源文本 从HTML页面中获取源代码 一键导出匹配文本 一键导出提取字符组,并按自定义的分隔符进行分隔 保存项目以便重复测试和修改 在“设计元素”中学习并创建正则表达式 直接从正则表达式库中选择利用正则表达式 多语种 100%-200%大字体下完美显示 你可以从任何纯文本中提取有规律的文字,比如txt文件,XML文件,csv文件,HTML文件等,然后导出到剪贴板或文本文件中,你可以很方便地把它们导入到程序,数据库,excel文件等。 正则表达式自动生成器现在有三个语言版本: 英语,简体中文,繁体中文,我们会在以后加入其他语言,比如日语,德语和法语等。 正则表达式自动生成器更新内容: 1、修复一些小bug。 2、增加自定义组和限定词的正则表达式 3、增加自定义窗口背景 4、增加自定义按钮背景 5、修改软件时间为UTC时间(日志除外) 6、修改更新模块 正则表达式自动生成器截图:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值