软件开发中,需要限制编辑框的数字范围,网上搜了一些,要么漏洞很多,要么不完善,于是博主重新学了一些正则表达式的语法。不多废话,请看正题:
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~199 | 1[0-9]{2} |
200~249 | 2[0-4][0-9] |
250~255 | 25[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~65535 | 6([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 测试界面如下所示:
更多推荐
数字范围正则表达式
发布评论