软件开发中,需要限制编辑框的数字范围,网上搜了一些,要么漏洞很多,要么不完善,于是博主重新学了一些正则表达式的语法。不多废话,请看正题:

1、[0,255]范围内的正则表达式:

^[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|(25[0-5])$

解析:这个范围IP地址中会用到,如果写成^[0-2][0-5]{2}$那就大错特错了,不仅会取000这样无意义的数值,还不能输入39、166等数字。

上述表达式虽长,但是分段看就很简单,将其分成5个区间:

取值范围正则表达式
0~9[0-9]
10~99[1-9][0-9]
100~1991[0-9]{2}
200~2492[0-4][0-9]
250~25525[0-5]

【注】不能将200~255写成2[0-5]{2},不然无法输入249之类的数字

2、[0-65535]范围内的正则表达式:

^[0-9]|[1-9][0-9][0-9]{0,2}|[1-5][0-9]{4}|6([0-4][0-9]{3}|5([0-4][0-9]{2}|5([0-2][0-9]|3[0-5])))$

解析:这是unsigned short的取值范围,上述表达式是将总区间划分为4个大区间,如下表所示:

取值范围正则表达式
0~9[0-9]
10~9999[1-9][0-9][0-9]{0,2}
10000~59999[1-5][0-9]{4}
60000~655356([0-4][0-9]{3}|5([0-4][0-9]{2}|5([0-2][0-9]|3[0-5])))

60000~65535又被分成4个小区间,分别是:60000~64999, 65000~65499, 65500~65529, 65530~65535

照着这个思路,可以写出各种范围内的正则表达式,包括负数。但取值范围越大,正则表达式越长,容易出错,大家如果有更好的写法,还望告知,感谢!

3、正则表达式测试Demo

博主用Qt写了一个测试正则表达式的Demo,代码如下:

3.1 头文件

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QRegExpValidator>

class Dialog : public QDialog
{
    Q_OBJECT
    
public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();
    
private slots:
    void onValidatorSetClicked();
    
private:
    QLineEdit           *_edtText;
    QLineEdit           *_edtValidator;
    QPushButton         *_btnValidatorSet;
    
    QRegExp             _regExp;
    QRegExpValidator    *_regExpValidator;
};
#endif // DIALOG_H

3.2 cpp文件

#include "dialog.h"
#include <QVBoxLayout>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    this->setWindowTitle("正则表达式测试");
    _edtText = new QLineEdit;
    _edtValidator = new QLineEdit;
    _btnValidatorSet = new QPushButton(tr("设置正则表达式"));
    
    this->setFixedSize(664, 278);
    
    QSize wgtSize(600, 50);
    _edtText->setFixedSize(wgtSize);
    _edtValidator->setFixedSize(wgtSize);
    _btnValidatorSet->setFixedSize(wgtSize);
    
    QFont ft("宋体", 22);
    _edtText->setFont(ft);
    _edtValidator->setFont(ft);
    _btnValidatorSet->setFont(ft);
    
    QVBoxLayout *lay = new QVBoxLayout(this);
    lay->addWidget(_edtText);
    lay->addWidget(_edtValidator);
    lay->addWidget(_btnValidatorSet);
    lay->setMargin(32);
    lay->setSpacing(32);
    
    QString strText = tr("^[0-9a-zA-Z_-]*$");
    _edtValidator->setText(strText);
    
    _regExp.setPattern(strText);
    _regExpValidator = new QRegExpValidator(_regExp, this);
    _edtText->setValidator(_regExpValidator);
    
    connect(_btnValidatorSet, SIGNAL(clicked()), this, SLOT(onValidatorSetClicked()));
}

Dialog::~Dialog()
{
}

void Dialog::onValidatorSetClicked()
{
    _edtText->clear();
    _edtText->setFocus();
    QString strValidator = _edtValidator->text();
    
    _regExp.setPattern(strValidator);
    _regExpValidator->setRegExp(_regExp);
    _edtText->setValidator(_regExpValidator);
}

3.3 测试界面如下所示:

 

更多推荐

数字范围正则表达式