QT 输入框输入限制 正则表达式限制 整理

在使用 输入数值时,经常遇到限制其范围的需要,比如角太阳高度角范围为[-90,90],经度值范围[-180,180],方位角范围[0,360]。Qt提供了QIntValidator和QDoubleValidator可以限定数值输入范围,如使用QIntValidator限制整数的数值范围:

1.只允许输入字母和汉字:

QRegExp regExp;
   regExp.setPattern("[a-zA-Z0-9_\u4e00-\u9fa5\\w]+$");
   QValidator * editName = new QRegExpValidator(regExp,ui->lineEdit);
   ui->lineEdit->setValidator(editName);
   ui->lineEdit->setMaxLength(10);

2.正则表达式限制 只允许输入 浮点数

QRegExp rx("^(-?[0]|-?[1-9][0-9]{0,5})(?:\\.\\d{1,4})?$|(^\\t?$)");
复制代码
3.使用正则表达式限制只能输入数字
QRegExp rx("[0-9\.]+$"); 
QRegExpValidator *validator = new QRegExpValidator(rx, this); 
ui->lineEdit->setValidator(validator);
复制代码
4.使用正则表达式限制只能输入IP地址
QRegExp rx = QRegExp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){4}"); 
QRegExpValidator *validator = new QRegExpValidator(rx, this); ui->lineEdit->setValidator(validator); 
ui->lineEdit->setInputMask("000.000.000.000");
  1. 限制 输入 值范围,此类直接限制不接收数字以外的输入,setRange设置接收范围

    QDoubleValidator * pDouVld = new QDoubleValidator(this);
    pDouVld->setRange(0,1000000000000000000);
    ui->lePort->setValidator(pDouVld);

6.只要字符数字

QRegExpValidator *validator2 = new QRegExpValidator(QRegExp("[A-Za-z0-9]*"), this);
    ui->leId->setValidator(validator2);

7.整理常用 正则表达式

^(-?[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})?)$
 
 
1.  式子中开头的^和结尾的$限定字符串的开始和结尾;
2.  "-?" 表示一个或0个负号,这里面的问号表示其前面的字符重复0次或1次;
3.  管道符"|"表示平行分组,比如后三个,表示180或其它形式;
4.  [1-9] 表示限定数字范围为1到9,其余类似,如果是有限几个值,还可以用枚举的方式,比如限定-255到255时,第一个数字2的限定,应该表达为[1,2],这表示这个位置只允许是1或者2;
5.  "\d"是一个转义字符,表示匹配一位数字;
6.  "\." 表示匹配小数点;
7.  "\d+",这里面的+表示其前面的\d重复一次或多次;
8.  "\d{1,4}",里面的{1,4}表示重复1到4次;
  1. 正则表达式语法:

    :匹配任何单个字符。例如正则表达式"b.g"能匹配如下字符串:"big"、"bug"、"b g",但是不匹配"buug","b..g"可以匹配"buug"。

    [ ] :匹配括号中的任何一个字符。例如正则表达式"b[aui]g"匹配bug、big和bag,但是不匹配beg、baug。可以在括号中使用连字符"-"来指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式"a[0-9]c"等价于"a[0123456789]c"就可以匹配"a0c"、"a1c"、"a2c"等字符串;还可以制定多个区间,例如"[A-Za-z]"可以匹配任何大小写字母,"[A-Za-z0-9]"可以匹配任何的大小写字母或者数字。

    ( ) :将 () 之间括起来的表达式定义为"组"(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。把一些字符表示为一个整体。改变优先级、定义提取组两个作用。

    | :将两个匹配条件进行逻辑"或"运算。'z|food' 能匹配"z" 或 "food"。'(z|f)ood' 则匹配"zood" 或 "food"。

    :匹配0至多个在它之前的子表达式,和通配符没关系。例如正则表达式"zo*"能匹配 "z" 、"zo"以及 "zoo";因此"."意味着能够匹配任意字符串。"z(b|c)"→zb、zbc、zcb、zccc、zbbbccc。"z(ab)*"能匹配z、zab、zabab(用括号改变优先级)。

    • :匹配前面的子表达式一次或多次,和*对比(0到多次)。例如正则表达式9+匹配9、99、999等。 "zo+"能匹配 "zo"以及 "zoo" ,不能匹配"z"。

    ? :匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或"does" 。一般用来匹配"可选部分"。

    {n} :匹配确定的 n 次。"zo{2}"→zoo。例如,"e{2}" 不能匹配"bed"中的"e",但是能匹配"seed"中的两个"e"。

    {n,} :至少匹配n次。例如,"e{2,}"不能匹配"bed"中的"e",但能匹配 "seeeeeeeed"中的所有"e"。

    {n,m} :最少匹配 n 次且最多匹配 m 次。"e{1,3}"将匹配"seeeeeeeed"中的前三个"e"。

    ^(shift+6) :匹配一行的开始。例如正则表达式"^regex"能够匹配字符串"regex我会用"的开始,但是不能匹配"我会用regex"。

    ^另外一种意思:非!(暂时不用理解)

    $ :匹配行结束符。例如正则表达式"浮云$" 能够匹配字符串"一切都是浮云"的末尾,但是不能匹配字符串"浮云呀"

    \d:代表一个数字,等同于[0-9]

    \D:代表非数字,等同于[^0-9]

    \s:代表换行符、Tab制表符等空白字符

    \S:代表非空白字符

    \w:匹配字母或数字或下划线或汉字,即能组成单词的字符

    \W:非\w ,等同于[^\w]

    d:digital;s:space、w:word。大写就是"非"

    Regex.IsMatch("bbbbg","^b.*g$");

    Regex.IsMatch("bg","^b.*g $ ");

    Regex.IsMatch("gege","^b.*g $ ");

    "^\d{3,4}-?\d+$"表示被匹配的字符序列应该是由三至四位数字组成,由于长途区号的连字符"-"可有可无,所以这里使用"?"元字符进行说明。由于连字符"-"在正则表达式中有特殊含义(表示范围,比如[0-9]),所以要对其进行转义。

    []括号中的任意字符,\w字母、数字、下划线,+一到多个。由于.在正则表达式中有特殊的含义,因此对于真正想表达"."则需要转移"."。先想正则表达式是语言无关的。

    +、*的匹配默认是贪婪(greedy)的:尽可能多的匹配,直到"再贪婪一点儿"其后的匹配模式就没法匹配为止。

    在+、*后添加?就变成非贪婪模式(? 的另外一个用途):让其后的匹配模式尽早的匹配。修改成"我是(.+?)。"

     图片src[^>]*[^/].(?:jpg|bmp|gif)(?:\"|\')
    
     中文 ^([\u4e00-\u9fa5]+|[a-zA-Z0-9]+)$
    
     网址"\<a.+?href=['""](?!http\:\/\/)(?!mailto\:)(?>foundAnchor>[^'"">]+?)[^>]*?\>"
    
     匹配中文字符的正则表达式:[\u4e00-\u9fa5]
    
     匹配双字节字符(包括汉字在内):[^\x00-\xff]
    
     匹配空行的正则表达式:\n[\s|]*\r
    
     匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
    
     匹配首尾空格的正则表达式:(^\s*)|(\s*$)(像vbscript那样的trim函数)
    
     匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
    
     匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
    
相关推荐
Qter_Sean29 分钟前
自己动手写Qt Creator插件
开发语言·qt
何曾参静谧33 分钟前
「QT」文件类 之 QIODevice 输入输出设备类
开发语言·qt
爱吃生蚝的于勒2 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
小白学大数据4 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python
冰芒猓4 小时前
SpringMVC数据校验、数据格式化处理、国际化设置
开发语言·maven
失落的香蕉4 小时前
C语言串讲-2之指针和结构体
java·c语言·开发语言
红中马喽5 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习
杜杜的man5 小时前
【go从零单排】Closing Channels通道关闭、Range over Channels
开发语言·后端·golang
java小吕布6 小时前
Java中Properties的使用详解
java·开发语言·后端
versatile_zpc6 小时前
C++初阶:类和对象(上)
开发语言·c++