Qt——正则表达式

转载 2018年04月15日 23:21:49

源地址:http://www.cnblogs.com/hellovenus/p/4984751.html



在项目中经常会遇到对字符串进行操作的情况,我们可以直接使用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中的QLineEdit控件中使用正则...
  • qq_19528953
  • qq_19528953
  • 2016-09-18 20:03:34
  • 2516

Qt 正则表达式(QRegExp)

正则表达式是对字符串操作的一种逻辑公式,匹配一系列符合某个句法规则的字符串。Qt的正则表示类是QRegExp,在很多情况下都可以用到,比如字符串验证、字符串搜索、搜索并替换、字符串分割等。QRegEx...
  • lingyun0
  • lingyun0
  • 2014-12-17 22:25:56
  • 5697

Qt实现实时正则表达式测试器

算是对boost学习的小结,当然也并没有完全看完boost,内容很多.只是看了一些常用的内容. 本篇文章将接合对boost正则表达式的学习,完成一个正则表达式测试器.UI借助了QT的实现. 首先当...
  • cp3alai
  • cp3alai
  • 2015-07-03 15:39:58
  • 789

Qt4.8.2 正则表达式提取数据

从提取出来这个图片的URL #include #include #include int main(int argc, char *argv[]) { QCoreAppl...
  • QQ575787460
  • QQ575787460
  • 2012-09-18 15:29:54
  • 4195

qt字符串的正则表达式查找

以下正则表达式全部通过qt的类QRegExp实现。 正则表达式知识完全
  • shaochat
  • shaochat
  • 2014-11-06 11:11:23
  • 6399

qt中用正则表达式实现提取字符串功能

正则表达式可以用来: (1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。 (2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。 (3)用来替换,...
  • u013193026
  • u013193026
  • 2015-04-21 13:40:29
  • 2230

Qt 正则表达式例程

  • 2014年12月19日 22:52
  • 6KB
  • 下载

qt中的正则表达式QRegExp使用大全以及匹配中括号[]方法大全

Qt的SDK里包含一个很帮的GUI工具,可以方便我们进行这类转换并测试你的表达式。可以按照如下的方式打开:“开始”->“程序”->“Qt SDK by Nokia v201...
  • struggle6688
  • struggle6688
  • 2017-03-23 15:20:55
  • 2840

qt正则表达式小例子.

获取网页源码中的链接
  • robertkun
  • robertkun
  • 2014-04-22 09:02:09
  • 2399

qt QRegularExpression 中文不包括“标点符号 特殊字符“ 的正则表达式

QRegularExpression rx("(?![\\p{P}\\p{S}])[\u4e00-\u9fa5]"); 《1》负预测模式 (?!模式) 负预测先行。 匹配与模式 ...
  • baidang201
  • baidang201
  • 2017-03-24 12:00:08
  • 1568
收藏助手
不良信息举报
您举报文章:Qt——正则表达式
举报原因:
原因补充:

(最多只允许输入30个字)