如何在QT中使用正则表达式

您所在的位置:网站首页 邮箱正则表达式怎么写 如何在QT中使用正则表达式

如何在QT中使用正则表达式

2024-07-15 20:01| 来源: 网络整理| 查看: 265

一、 简介

我们在上一篇博客中讲解了正则表达式语法。但是还有很多疑问,正则表达式如何使用呢?还有就是,正则表达式主要是有哪些应用呢?

二、应用场景

在项目中经常会遇到对字符串进行操作的情况,我们可以直接使用QString的一些函数,但QT提供了一个更加强大的类——QRegExp,使用正则表达式来操作字符串。正则表达式有许多方便应用,比如:检验游戏玩家名字是否符合格式、取得一串字符串中所有子数列 这种子数列是一个小写字母加一个大写字母、对输入框LineEdit中的输入内容加以限制 比如只能输入数字 并且最多5位数。正则表达式更方便的完成这些功能。

1.验证

判断字符串是否符合某个标准,比如“是一个整数”或者“没有空格”。

2.搜索

正则表达式提供了比普通字符串匹配更为强大的匹配方式,比如匹配下面的词语:mail, letter, correspondence,但是不包括email, mailman, letterbox等等。

3.查找并替换

正则表达式能够用一个不同的字符串,替换所有出现另一个字符串的地方,比如用&替换&,如果原先&后面已经有了amp;那么不替换。

4.分割字符串

比如,根据tab来分割字符串。

三、语法

有关详细语法可查看博主上一篇文章,下面主要是罗列常用字符和注意事项。 在这里插入图片描述 注意:C++编译器会对反斜杠进行转换,要想在正则表达式中包括一个\,需要输入两次,例如\s。要想匹配反斜杠本身,需要输入4次,比如\\。

四、QRegExp类介绍

-默认构造函数,QRegExp(),产生一个空的正则表达式对象。 -拷贝构造函数,QRegExp(const QRegExp& patten) -模式构造函数,QRegExp ( const QString & pattern,Qt::CaseSensitivity cs = Qt::CaseSensitive, PatternSyntax syntax =RegExp),产生指定匹配模式的正则表达式对象。 1) isValid(),判断正则表达式是否合法,合法返回true,否则返回false。 例如:QRegExpexp1(“c[9]”); boolvalid=exp1.isValid();//返回true QRegExpexp1(“c[9”); boolvalid=exp1.isValid();//返回false 2)errorString()检查正则是否有错误, 3)isEmpty(),判断正则是否为空,当采用默认构造函数生成正则时,此函数返回true,否则返回false。 QRegExp exp1; bool valid=exp1.isEmpty();//返回true 4) caseSensitivity () 看正则是否大小写敏感。 5) cap(),capturedTexts ()前者获得捕捉的每一项,index从1开始,后者则获得整个捕捉列表。 6) exactMatch(QString),返回是否整串匹配,匹配一部分也返回false。 7) indexIn(),进行匹配,如果成功则返回index,不成功返回-1 8) matchedLength(),返回匹配的串的长度。 9) numCaptures(),获得正则里捕捉项的个数。 10) pattern(),获得正则本身 11) patternSyntax() enum PatternSyntax { RegExp, RegExp2, Wildcard, FixedString }默认为RegExp。

五、应用 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。 在这里插入图片描述 这个枚举类型说明了被验证的字符串是哪种类型。

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类用于根据正则表达式检查字符串。 QRegExpValidator使用正则表达式(regexp)来确定输入字符串是“可接受”,“中间”还是“无效”。 可以在构造QRegExpValidator时或在以后的时间提供regexp。 */ 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,则完全匹配。

QString str = ui->lineEdit->text(); QRegExp rx("^[1-9]\\d{0,1}"); QRegExpValidator v(rx,0); int pos = 0; bool ret = v.validate(str,pos); if(ret==QRegExpValidator::Acceptable) qDebug()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3