Qt 正则表达式:生成指定范围数值的正则表达式接口(整数和小数都可以)

int getExpNext(int num,int max)
{
    QString chars = QString::number(num);
    for (int i=chars.length()-1;  i>=0 ; i--)
    {
        if (chars[i]=='0')
        {
            chars[i] = '9';
        }
        else
        {
            chars[i] = '9';
            break;
        }
    }
    int value = chars.toInt();
    if(value < max)
        return chars.toInt();
    chars = QString::number(num);
    QString charsMax = QString::number(max);
    if(charsMax.length() == chars.length())
    {
        for (int i=0; i < chars.length(); i++)
        {
            if (chars[i] < charsMax[i])
            {
                if(i == chars.length()-1)
                {
                    return max;
                }
                else
                {
                    chars[i] = '0' + charsMax.at(i).toLatin1() - '0'-1;
                    for(int j = i+1; j < chars.length(); j++)
                    {
                        chars[j] = '9';
                    }
                }
                return chars.toInt();
            }
        }
    }
    return max;
}
//指定范围和小数位数,生成一个正则表达式,
    //min 最小值,max最大值,decimalCount 小数位数,即只能输入min~max范围的数值,最多decimalCount位小数位,如果decimalCount=0,就是整数
    QString getExpStr(int min,int max,int decimalCount)
    {
        if(min > max)
            return "";
        if(min == max)
            return QString::number(min);

        QList<int> minList;
        QList<int> maxList;
        max--;
        int value = min;
        int temp = value;
        while (value < max)
        {
            temp = value;
            value = getExpNext(value,max);
            minList << temp;
            maxList << value;
            value++;
        }
        QString expStr;
        if(max % 10 == 0)
            expStr+= QString("(%1)").arg(max);
        for(int i =0; i < minList.count(); i++)
        {
            QString minStr = QString::number(minList[i]);
            QString maxStr = QString::number(maxList[i]);
            QString str = QString("(");
            for(int j = 0 ; j < minStr.length(); j++)
            {
                if(minStr[j] == maxStr[j])
                {
                    str +=minStr[j];
                }
                else
                    str += QString("[%1-%2]").arg(minStr[j]).arg(maxStr[j]);
            }
            str += ")";
            if(!expStr.isEmpty())
                expStr += "|";
            expStr += str;
        }
        if(decimalCount > 0)
            expStr = QString("^(%1|(%4))|((%2)%3)$").arg(expStr).arg(expStr).arg(QString("\\.[0-9]{%1}").arg(decimalCount)).arg(max+1);
        else
            expStr = QString("^(%1|(%2))$").arg(expStr).arg(max+1);
        return expStr ;
    }

例子:


    int min = ui->lineEdit->text().toInt();
    int max = ui->lineEdit_2->text().toInt();
    QRegExp regx(getExpStr(min,max,3));
    ui->lineEdit_3->setValidator( new QRegExpValidator(regx,this));

修改为纯C++版本
 

#include <iostream>
#include <string>
#include <vector>

int getExpNext(int num, int max) 
{
    std::string chars = std::to_string(num);
    
    for (int i = static_cast<int>(chars.length()-1); i >= 0; i--) 
    {
        if (chars[i] == '0') 
	    {
            chars[i] = '9';
        } 
	    else 
	    {
            chars[i] = '9';
            break;
        }
    }

    int value = std::stoi(chars);
    
    if (value < max) 
    {
        return value;
    }

    chars = std::to_string(num);
    
    std::string charsMax = std::to_string(max);

    if(charsMax.length() == chars.length()) 
    {
        for (int i = 0; i < static_cast<int>(chars.length()); i++) 
	    {
            if (chars[i] < charsMax[i]) 
	        {
                if (i == static_cast<int>(chars.length()-1)) 
		        {
                    return max;
                } 
		        else 
		        {
                    chars[i] = '0' + charsMax.at(i) - '0' - 1;
                    for (int j = i + 1; j < static_cast<int>(chars.length()); j++) 
		            {
                        chars[j] = '9';
                    }
                }
                return std::stoi(chars);
            }
        }
    }
    
    return max;
}

std::string getExpStr(int min, int max, int decimalCount) 
{
    if(min > max) 
    {
        return "";
    }

    if(min == max) 
    {
        return std::to_string(min);
    }

    std::vector<int> minList;
    std::vector<int> maxList;

    max--;
    int value = min;
    int temp = value;

    while (value < max)
     {
        temp = value;
        value = getExpNext(value, max);
        minList.push_back(temp);
        maxList.push_back(value);
        value++;
    }

    std::string expStr;

    if (max % 10 == 0) 
    {
        expStr += std::to_string(max);
    }

    for (size_t i = 0; i < minList.size(); i++) 
    {
        std::string minStr = std::to_string(minList[i]);
        std::string maxStr = std::to_string(maxList[i]);
        std::string str = "(";

        for (size_t j = 0; j < minStr.length(); j++) 
	    {
            if (minStr[j] == maxStr[j]) 
	        {
                str += minStr[j];
            } 
	        else 
	        {
                str += "[" + std::to_string(minStr[j]) + "-" + std::to_string(maxStr[j]) + "]";
            }
        }

        str += ")";
        if (!expStr.empty()) 
	    {
            expStr += "|";
        }
        expStr += str;
    }

    if (decimalCount > 0) 
    {
        expStr = "^((" + expStr + ")|((" + expStr + ")" + "\\.[0-9]{" + std::to_string(decimalCount) + "}))|((" + std::to_string(max+1) + "))$";
    } 
    else 
    {
        expStr = "^((" + expStr + ")|((" + std::to_string(max+1) + ")))$";
    }

    return expStr;
}

int main() {
    int min = 10;
    int max = 100;
    int decimalCount = 2;

    std::string regex = getExpStr(min, max, decimalCount);

    std::cout << "Generated regular expression: " << regex << std::endl;

    return 0;
}
  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值