在《QT限制文本框输入的方法》一文中,介绍了如何通过正则表达式来限制文本框的方法,但是这种做法,是预先知道文本框的限制范围,然后再编写对应的正则表达式,然现实中往往好多应用事先并不知道文本框的输入范围,当条件改变了,文本框的相应范围也跟着改变,如果这种改变范围不多的话,通过《QT限制文本框输入的方法》中介绍的方法还可以搞定,但如果改变情况很多的话,采用上面的那种方法很显然不合适,为此,本文介绍一种根据输入范围,生成对应的正则表达式的方法。
1.用到的正则表达式知识
(1)^ 匹配字符串的开始
(2)$匹配字符串的结束
(3){n,m}重复n到m次
(4)x|y匹配x或y
(5)[0-9]匹配0到9
(6)?匹配前面的子表达式零次或一次
(7)\t匹配一个制表符(匹配退格键)
2.生成任意正整数n,范围为[1 ,n] 的正则表达式
首先看1个例子:假设n=2567,限制范围为[1,2567],其正则表达式为:
^[1-2][0-5][0-6][0-7]|[1-1][0-9]{0,3}| [1-2][0-4][0-9]{0,2}|[1-2][0-5][0-5][0-9]{0,1} |[1-9][0-9]{0-2}$
上面就是[1,2567]的正则表达式,大家有没有看出一些规律,我将上面的表达式分为3个部分,
(1)[1-2][0-5][0-6][0-7]|[1-1][0-9]{0,3}
第一部分,[]分隔号-前的数子除第一个[]为1以外,其他的都为0,分隔号后面的数字分别对应2567的十进制值;
(2) [1-2][0-4][0-9]{0,2}|[1-2][0-5][0-5][0-9]{0,1}
从次高为开始(这里也即百位),分隔号-后面的数字,比百位数字5少1,十位和个位可以是0~9的数字,也可以没有十位和个位;
接下来从十位开始,分隔号-后面的数字,比十位数字6少1,个位可以是0~9的数字,也可以没有个位。
(3)[1-9][0-9]{0-2}
第三部分,最多位数为3位,比n=2567四位少1位,所以最大输入可以是9999 < 2567
通过上面的介绍我们发现第一部,第二部分,第三部分都是有规律可循的,下面是实现方法:
QString getFormalStr(int n)
{
/*求十进制位,结果存放到decimalList中*/
QList decimalList;
while(n != 0)
{
decimalList.append(cycleNum % 10);
n /= 10;
}
QString str, str1;
int cnt = decimalList.count();
if (cnt > 0)
{
str = "^(";
for (int i = cnt - 1; i >= 0; i--)
{
/*第一部分*/
if (i + 1 == cnt)
{
int decimal = decimalList.at(i);
str += str1.sprintf("[1-%d]", decimal);
for (int j = cnt - 2; j >= 0; j--)
{
str += str1.sprintf("[0-%d]", decimalList.at(j));
}
if (cnt > 1 && decimal > 1)
{
str += "|";
str += str1.sprintf("[1-%d]", decimal - 1);
str += "[0-9]";
str += str1.sprintf("{0,%d}", cnt - 1);
}
}
/*第二部分*/
if (cnt > 2 && i + 1 != cnt)
{
str += "|";
for (int j = cnt - 1; j >= 0; j--)
{
int decimal = decimalList.at(j);
if (j > i)
{
if (j + 1 == cnt)
str += str1.sprintf("[1-%d]", decimal);
else
str += str1.sprintf("[0-%d]", decimal);
}
else if (j == i)
{
decimal = decimal - 1;
if (decimal < 0)
decimal = 0;
str += str1.sprintf("[0-%d]", decimal);
if (i > 0)
{
str += str1.sprintf("[0-9]{0,%d}", i - 1);
}
break;
}
}
}
}
/*第三部分*/
if (cnt > 1)
{
str += "|[1-9]";
if (cnt > 2)
str += str1.sprintf("[0-9]{0,%d}", cnt - 2);
}
str += ")$|(^\\t?$)";
}
else
{
str = "(^\\t?$)";
}
return str;
}
应用实例:
#include
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QLineEdit edit;
QString str = getFormalStr(2567);
QRegExp rx(str);
QRegExpValidator *pReg = new QRegExpValidator(rx, &edit);
edit.setValidator(pReg);
edit.show();
return a.exec();
}
到这里,生成[1,n]的正则表达式已经介绍完了,那么,[-n,-1]的正则表达式怎么实现呢?浮点数的表达式怎么实现呢?这个留给读者自己实现?