Qt——正则表达式
在项目中经常会遇到对字符串进行操作的情况,我们可以直接使用QString的一些函数,但QT提供了一个更加强大的类——QRegExp,使用正则表达式来操作字符串。
先说说我最近遇到的几个问题:
1.对输入框LineEdit中的输入内容加以限制,比如只能输入数字,并且最多5位数(因为int类型不限制位数会导致溢出问题);
2.检查输入是否正确,比如判断是否是1-9999之间的数;
3.获取一个字符串中的一段内容,比如获取2015-11-20中的2015。
为了解决这些问题,下面先看看正则表达式的基本知识。
一、基本知识
正则表达式(Regular Expression,通常简写为RegExp、RE等),预先定义一些字符或字符的组合,用于匹配文本中的一段字符串。下面是它的一些用途——
1.验证
判断字符串是否符合某个标准,比如“是一个整数”或者“没有空格”。
2.搜索
正则表达式提供了比普通字符串匹配更为强大的匹配方式,比如匹配下面的词语:mail, letter, correspondence,但是不包括email, mailman, letterbox等等。
3.查找并替换
正则表达式能够用一个不同的字符串,替换所有出现另一个字符串的地方,比如用&替换&,如果原先&后面已经有了amp;那么不替换。
4.分割字符串
比如,根据tab来分割字符串。
使用正则表达式首先需要了解一些符号的作用,比如\d用来匹配数字,下面结合一些例子说明。
例子 | 解释 |
---|---|
[abc] |
方括号中间是几个字母,表示a,b,c这三个单独的字符 |
[^abc] |
除了a,b,c以外的字符 |
[a-z] |
横杠表示范围,匹配a到z之间(包括a和z)的所有单个字符 |
[a-zA-Z] |
a到z、A到Z的所有单个字符 |
^ |
在一行最前 |
$ |
在一行的最后 |
\s |
匹配任意空白字符 |
\S |
匹配任意非空白的字符 |
\d |
任意数字 |
\D |
任意非数字 |
\w |
任意单字字符(字母、数字或下划线) |
\W |
任意非单字字符 |
(a|b) |
a或b |
a? |
?代表0个或1个 |
a* |
*代表0个或1个或多个 |
a+ |
+代表1个或多个 |
a{3} |
3个a |
a{3,} |
3个或大于3个a |
a{3,6} |
a的个数在3和6之间(包括3和6) |
注意:C++编译器会对反斜杠进行转换,要想在正则表达式中包括一个\,需要输入两次,例如\\s。要想匹配反斜杠本身,需要输入4次,比如\\\\。
二、在QT中的用法
1.对用户输入的限制
void QLineEdit::setValidator(const QValidator * v)
QLineEdit中的这个函数意思是,令LineEidt只接受验证器 v 所匹配的输入,你可以对要输入的内容进行任意的限制。
比如:限制输入框只能输入0到99999
QRegExp regExp("0|[1-9]\\d{0,4}");
ui.lineEdit->setValidator(new QRegExpValidator(regExp, this));
2.检查输入是否符合格式
QValidator::State QRegExpValidator::validate(QString & input, int & pos) const
如果输入与正则表达式相匹配,则返回Acceptable;如果部分匹配,则返回Intermediate(部分匹配,意思是如果给它增加额外的字符则能够匹配正则表达式);如果不匹配则返回Invalid。
enum QValidator::State
这个枚举类型说明了被验证的字符串是哪种类型。
QValidator::Invalid:值为0,表示字符串完全不匹配;
QValidator::Intermediate:值为1,表示部分匹配;
QValidator::Acceptable:值为2,表示完全匹配。
// integers 1 to 9999
QRegExp rx("[1-9]\\d{0,3}");
// the validator treats the regexp as "^[1-9]\\d{0,3}$"
QRegExpValidator v(rx, 0);
QString s;
int pos = 0;
s = "0"; v.validate(s, pos); // returns Invalid
s = "12345"; v.validate(s, pos); // returns Invalid
s = "1"; v.validate(s, pos); // returns Acceptable
rx.setPattern("\\S+"); // one or more non-whitespace characters
v.setRegExp(rx);
s = "myfile.txt"; v.validate(s, pos); // Returns Acceptable
s = "my file.txt"; v.validate(s, pos); // Returns Invalid
// A, B or C followed by exactly five digits followed by W, X, Y or Z
rx.setPattern("[A-C]\\d{5}[W-Z]");
v.setRegExp(rx);
s = "a12345Z"; v.validate(s, pos); // Returns Invalid
s = "A12345Z"; v.validate(s, pos); // Returns Acceptable
s = "B12"; v.validate(s, pos); // Returns Intermediate
// match most 'readme' files
rx.setPattern("read\\S?me(\.(txt|asc|1st))?");
rx.setCaseSensitive(false);
v.setRegExp(rx);
s = "readme"; v.validate(s, pos); // Returns Acceptable
s = "README.1ST"; v.validate(s, pos); // Returns Acceptable
s = "read me.txt"; v.validate(s, pos); // Returns Invalid
s = "readm"; v.validate(s, pos); // Returns Intermediate
^[0-9]+3c$
看上面的表达式,开头的^表示必须以[0-9]+开头,结尾的$表示必须以字母c结尾,如果输入的是123a,则返回QValidator::Intermediate,表示部分匹配,如果输入的是233abc,则完全匹配。
3.截取字符串
QString QRegExp::cap(int nth = 0) const
这个函数返回被第n个子表达式捕获的文本,整个匹配拥有下标0,带括号的子表达式下标从1开始。
QRegExp rxlen("(\\d+)(?:\\s*)(cm|inch)");
int pos = rxlen.indexIn("Length: 189cm");
if (pos > -1) {
QString value = rxlen.cap(1); // "189"
QString unit = rxlen.cap(2); // "cm"
// ...
}
关于正则表达式的知识还有很多,比如结合QString的replace、split等函数使用,更多用法可以参考Qt Assistant。
Qt——正则表达式的更多相关文章
- QT正则表达式---针对IP地址
判断合法IP的QT正则表达式: bool IsIPaddress(QString ip) { QRegExp rx2("(//d+)(//.)(//d+)(//.)(//d+)(//.)(/ ...
- QT正则表达式
QT正则表达式有一个问题,当初始状态是不符合正则表达式时,能够输入任意字符,若在输入过程中符合正则表达式,马上进入字符检测状态,即只能接受符合正则表达式的字符.
- Qt正则表达式提取数据
这几天在上嵌入式课程设计,需要用到Qt,这个是信号与槽的,寒假的时候也简单学习了一些,但是没有怎么深入,又回过来看了看Qt,发现Qt的ui界面配置与Android的好像,当然Qt也可以拿来开发Andr ...
- QT正则表达式学习(Windows目录禁止九个字符)
exp 正则表达式30分钟入门教程 http://deerchao.net/tutorials/regex/regex.htm 元字符 .*^\d\b\s,当然还有\,还有中括号[] .是一个元字符, ...
- QT 正则表达式无效
背景:写了一个判断IP地址合法的正则表达式,并让它应用在输入框中 代码如下 QRegExp rx_ip("^((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}( ...
- C/C++之Qt正则表达式
引言 正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征.比如 表达式“ab+” 描述的特征是“一个 'a' 和 任意个 ...
- Qt 正则表达式检查 IP 格式
KillerSmath 2018年6月29日 下午10:41 @Pranit-Patil Hi there. Like @jonB says above, you should to replace\ ...
- Qt:正则表达式语法:
正则表达式是验证输入.从输入中提取数据以及对输入进行搜索和替换的强大工具,所谓正则表达式,regexp是一种利用模式匹配语言来描述字符串组成限制条件的方式; Qt 提供了一个Q ...
- qt之正则表达式
原地址:http://blog.csdn.net/phay/article/details/7304455 QRegExp是Qt的正则表达式类.Qt中有两个不同类的正则表达式.第一类为元字符.它表示一 ...
随机推荐
- 如何在Java Filter 中注入 Service
在项目中遇到一个问题,在 Filter中注入 Serivce失败,注入的service始终为null.如下所示: public class WeiXinFilter implements Filter ...
- ASP.NET发布网站遇到的几个问题
环境背景 操作系统:Win7 开发工具:Visual Studio 2013 Framework: Framework 4.0 Issue1: 无法识别的属性“targetFramework” 解决方 ...
- (五) openwrt打包过程
标签(空格分隔): Makefile 本周是成胖子每周一博第六周,更好地阅读体验,请点击这里 前言 前面我们已经讲了openwrt编译的大部分过程,包括大致的编译步骤,ipk的编译等.今天是我这个系列 ...
- 移动web在ios和android下点击元素出现阴影问题
移动web开发经验总结 1.-webkit-tap-highlight-color:rgba(255,255,255,0)可以同时屏蔽ios和android下点击元素时出现的阴影.备注:transp ...
- 《互联网+:从IT到DT》:阿里公关稿,数据与案例不够全面客观,电商部分有一些生动的例子,三星
本书是阿里研究院的集体创作,当然要从阿里的视角写,因此其他的互联网巨头的信息很少涉及,对阿里不利的案例很少涉及. 关于“互联网+”,关于“互联网+”跟互联网的区别,书的开头有一点介绍.我感觉总体来说直 ...
- Doctype文档类型、作用及触发方式
Doctype文档类型 1) 该标签可声明三种 DTD 类型,分别表示严格版本.过渡版本以及基于框架的 HTML 文档. 2) HTML 4.01 规定了三种文档类型:Strict.Transit ...
- 用Java实现单链表的基本操作
笔试题中经常遇到单链表的考题,下面用java总结一下单链表的基本操作,包括添加删除节点,以及链表转置. package mars; //单链表添加,删除节点 public class ListNode ...
- Hadoop中WritableComparable 和 comparator
1.WritableComparable 查看HadoopAPI,如图所示: WritableComparable继承自Writable和java.lang.Comparable接口,是一个Writa ...
- Golang tips ----- 函数
1.在函数调用时,Golang没有默认参数值 2.一个函数声明如果没有函数体,表面该函数不是由Golang实现的,这样的声明定义了函数标识符 3.拥有函数名的函数只能在包级语法块中被声明 4.函数值( ...
- codevs 2822 爱在心中
codevs 2822 爱在心中 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description “每个人都拥有一个梦,即使彼此不相同, ...