分类:
版权声明:本文为博主原创文章,未经博主允许不得转载。
在使用QLineEdit输入数值时,经常遇到限制其范围的需要,比如角太阳高度角范围为[-90,90],经度值范围[-180,180],方位角范围[0,360]。Qt提供了QIntValidator和QDoubleValidator可以限定数值输入范围,如使用QIntValidator限制整数的数值范围:
例1:
- lineEdit->setValidator(new QIntValidator(0, 1000, this));
例2:
- lineEdit->setValidator(new QDoubleValidator(-180.0,180.0,6,this));
对于浮点数,使用QDoubleValidator时,发现只能限制只输入小数,但是无法设定数值范围,因此有必要对这个问题做一番研究。
除了QIntValidator和QDoubleValidator,Qt提供另一种校验器是正则表达式校验器:QRegExpValidator,下面是一些常用的利用正则表达式校验器限定数值范围的用法:
限制浮点数输入范围为[-999999.9999,999999.9999]
- QRegExp rx("^(-?[0]|-?[1-9][0-9]{0,5})(?:\\.\\d{1,4})?$|(^\\t?$)");
- QRegExpValidator *pReg = new QRegExpValidator(rx, this);
- lineEdit->setValidator(pReg);
限制浮点数输入范围为[-180,180]
- QRegExp rx("(^-?180$)|(^-?1[0-7]\\d$)|(^-?[1-9]\\d$)|(^-?[1-9]$)|^0$");
- QRegExpValidator *pReg = new QRegExpValidator(rx, this);
- lineEdit->setValidator(pReg);
限制浮点数输入范围为[-180,180]
- QRegExp rx("^-?(180|1?[0-7]?\\d(\\.\\d+)?)$");
- QRegExpValidator *pReg = new QRegExpValidator(rx, this);
- lineEdit->setValidator(pReg);
限制浮点数输入范围为[-180,180]并限定为小数位后4位
- QRegExp rx("^-?(180|1?[0-7]?\\d(\\.\\d{1,4})?)$");
- QRegExpValidator *pReg = new QRegExpValidator(rx, this);
- lineEdit->setValidator(pReg);
限制浮点数输入范围为[-90,90]并限定为小数位后4位
- QRegExp rx("^-?(90|[1-8]?\\d(\\.\\d{1,4})?)$");
- QRegExpValidator *pReg = new QRegExpValidator(rx, this);
- lineEdit->setValidator(pReg);
简单说明一下这几个正则表达式:
^(-?[0]|-?[1-9][0-9]{0,5})(?:\.\d{1,4})?$|(^\t?$)
(^-?180$)|(^-?1[0-7]\d$)|(^-?[1-9]\d$)|(^-?[1-9]$)|^0$
^-?(180|1?[0-7]?\d(\.\d+)?)$
^-?(180|1?[0-7]?\d(\.\d{1,4})?)$
^-?(90|[1-8]?\d(\.\d{1,4})?)$
- 式子中开头的^和结尾的$限定字符串的开始和结尾;
- "-?" 表示一个或0个负号,这里面的问号表示其前面的字符重复0次或1次;
- 管道符“|”表示平行分组,比如后三个,表示180或其它形式;
- [1-9] 表示限定数字范围为1到9,其余类似,如果是有限几个值,还可以用枚举的方式,比如限定-255到255时,第一个数字2的限定,应该表达为[1,2],这表示这个位置只允许是1或者2;
- "\d"是一个转义字符,表示匹配一位数字;
- “\.” 表示匹配小数点;
- "\d+",这里面的+表示其前面的\d重复一次或多次;
- "\d{1,4}",里面的{1,4}表示重复1到4次;
有了以上知识,下面我们可以很快的写出限定[-255,255]的正则表达式:
[-255,255]整数:^-?(255|[1,2]?[0-4]?\d|[1,2]?5[0-4]?)$
[-255,255]小数:^-?(255|([1,2]?[0-4]?\d|[1,2]?5[0-4]?)(\.\d)?)$
参考:
[1]Qt限制文本框输入的方法

版权声明:本文为博主原创文章,未经博主允许不得转载。
例1:
- lineEdit->setValidator(new QIntValidator(0, 1000, this));
- lineEdit->setValidator(new QDoubleValidator(-180.0,180.0,6,this));
对于浮点数,使用QDoubleValidator时,发现只能限制只输入小数,但是无法设定数值范围,因此有必要对这个问题做一番研究。
除了QIntValidator和QDoubleValidator,Qt提供另一种校验器是正则表达式校验器:QRegExpValidator,下面是一些常用的利用正则表达式校验器限定数值范围的用法:
限制浮点数输入范围为[-999999.9999,999999.9999]
- QRegExp rx("^(-?[0]|-?[1-9][0-9]{0,5})(?:\\.\\d{1,4})?$|(^\\t?$)");
- QRegExpValidator *pReg = new QRegExpValidator(rx, this);
- lineEdit->setValidator(pReg);
- QRegExp rx("(^-?180$)|(^-?1[0-7]\\d$)|(^-?[1-9]\\d$)|(^-?[1-9]$)|^0$");
- QRegExpValidator *pReg = new QRegExpValidator(rx, this);
- lineEdit->setValidator(pReg);
- QRegExp rx("^-?(180|1?[0-7]?\\d(\\.\\d+)?)$");
- QRegExpValidator *pReg = new QRegExpValidator(rx, this);
- lineEdit->setValidator(pReg);
- QRegExp rx("^-?(180|1?[0-7]?\\d(\\.\\d{1,4})?)$");
- QRegExpValidator *pReg = new QRegExpValidator(rx, this);
- lineEdit->setValidator(pReg);
- QRegExp rx("^-?(90|[1-8]?\\d(\\.\\d{1,4})?)$");
- QRegExpValidator *pReg = new QRegExpValidator(rx, this);
- lineEdit->setValidator(pReg);
简单说明一下这几个正则表达式:
^(-?[0]|-?[1-9][0-9]{0,5})(?:\.\d{1,4})?$|(^\t?$)
(^-?180$)|(^-?1[0-7]\d$)|(^-?[1-9]\d$)|(^-?[1-9]$)|^0$
^-?(180|1?[0-7]?\d(\.\d+)?)$
^-?(180|1?[0-7]?\d(\.\d{1,4})?)$
^-?(90|[1-8]?\d(\.\d{1,4})?)$
- 式子中开头的^和结尾的$限定字符串的开始和结尾;
- "-?" 表示一个或0个负号,这里面的问号表示其前面的字符重复0次或1次;
- 管道符“|”表示平行分组,比如后三个,表示180或其它形式;
- [1-9] 表示限定数字范围为1到9,其余类似,如果是有限几个值,还可以用枚举的方式,比如限定-255到255时,第一个数字2的限定,应该表达为[1,2],这表示这个位置只允许是1或者2;
- "\d"是一个转义字符,表示匹配一位数字;
- “\.” 表示匹配小数点;
- "\d+",这里面的+表示其前面的\d重复一次或多次;
- "\d{1,4}",里面的{1,4}表示重复1到4次;
有了以上知识,下面我们可以很快的写出限定[-255,255]的正则表达式:
[-255,255]整数:^-?(255|[1,2]?[0-4]?\d|[1,2]?5[0-4]?)$
[-255,255]小数:^-?(255|([1,2]?[0-4]?\d|[1,2]?5[0-4]?)(\.\d)?)$
参考:
[1]Qt限制文本框输入的方法
IP地址的正则表达式
关键字:IP地址 正则表达式
作者:txw1958
出处:http://www.cnblogs.com/txw1958/archive/2011/10/13/ip_address_regular_expression.html
IP地址的长度为32位,分为4段,每段8位,用十进制数字表示,每段数字范围为0~255,段与段之间用英文句点“.”隔开。例如:某台计算机IP地址为10.11.44.100。
分析IP地址的组成特点:250-255、200-249、0-199。
这三种情况可以分开考虑,
1. 250-255:特点:三位数,百位是2,十位是5,个位是0~5,用正则表达式可以写成:25[0-5]
2. 200-249:特点:三位数,百位是2,十位是0~4,个位是0~9,用正则表达式可以写成:2[0-4]\d
3. 0-199:这个可以继续分拆,这样写起来更加简单明了.
3.1. 0-9: 特点:一位数,个位是0~9,用正则表达式可以写成:\d
3.2. 10-99: 特点:二位数,十位是1~9,个位是0~9,用正则表达式可以写成:[1-9]\d
3.3. 100-199:特点:三位数,百位是1,十位是0~9,个位是0~9,用正则表达式可以写成:1\d{2}
于是0-99的正则表达式可以合写为[1-9]?\d,那么0-199用正则表达式就可以写成(1\d{2})|([1-9]?\d),这样0~255的正则表达式就可以写成(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))
最后,前面3段加上句点.可以使用{3}重复得到,第4段再来一次同样的匹配,得到IP地址的正则表达式:
((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))
与大家互动一下:
1. 为什么三位数的匹配放在二位数/一位数的前面?因为正则表达式规则之一:最先开始的匹配拥有最高的优先权。
2. 0.0.0.0和255.255.255.255是合法存在的IP地址,你知道是为什么吗?
3. 192.169.01.108这种数字前面多带了个0的类型的,在这里不是合法的,为什么要这样?
4. 为什么前面在最前面要有?:呢?它在这里有什么用?
5. 如果您发现本表达式有错误,也请留言指正!
我使用的正则表达式验证工具,The Regulator 下载地址:http://sourceforge.net/projects/regulator/