Qt限制文本框变化输入条件的方法

在《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]的正则表达式怎么实现呢?浮点数的表达式怎么实现呢?这个留给读者自己实现?

你可能感兴趣的:(技术)