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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

主要思路:遍历,判断 找范围正则验证规律例如(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();
        }

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

 

 最后单例调用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值