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;
}