前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >59.QT-QRegExp和QRegularExpression

59.QT-QRegExp和QRegularExpression

作者头像
诺谦
发布2020-12-17 15:16:16
1.6K0
发布2020-12-17 15:16:16
举报
文章被收录于专栏:Linux驱动Linux驱动

1.QRegExp

qt5.0版本之前正则表示示类是QRegExp,通过它能够筛选出我们想要的数据,它的构造函数如下所示:

代码语言:javascript
复制
QRegExp::QRegExp(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive, QRegExp::PatternSyntax syntax);

其中QRegExp::PatternSyntax syntax用于解释模式含义的语法,默认选择QRegExp::RegExp,主要参数如下所示:

1.1 QRegExp::RegExp

常见元字符:

  • . 匹配除换行符以外的任意字符
  • \w 匹配字母或数字或下划线或汉字
  • \s 匹配任意的空白符
  • \d 匹配数字
  • \b 匹配单词的开始或结束
  • ^ 匹配字符串的开始
  • $ 匹配字符串的结束
  • [] 匹配括号内输入的任意字符. 例如[123],只要是1, 2 ,3,12,23都满足
  • () 表示一个集合,用于提取匹配的字符串,表达式中有几个()就有几个相应的匹配字符串。

限定重复元字符:

  • * 重复零次或更多次 例如, 1*2可以为任意数量个1(甚至没有), 后面跟一个2
  • + 重复一次或更多次 例如, 1+2必须为一个或多个1, 后跟一个2
  • ? 重复零次或一次 例如,-?1 必须为1,或者-1
  • {n} 重复n次 例如 1?2可以为2或12
  • {n,} 重复n次或更多次
  • {n,m} 重复n到m次

反义元字符:

  • \W 匹配任意不是字母,数字,下划线,汉字的字符
  • \S 匹配任意不是空白符的字符
  • \D 匹配任意非数字的字符
  • \B 匹配不是单词开头或结束的位置
  • [^x] 匹配除了x以外的任意字符
  • [^aeiou] 匹配除了aeiou这几个字母以外的任意字符

元字符转义:

  • 如果想查找元字符本身的话,就得使用\来取消这些字符的特殊意义,比如: deerchao\.cn匹配deerchao.cn

元字符使用示例:

代码语言:javascript
复制
^\d{5,12}$               //  匹配数字(比如qq号),必须为5位到12位数字

"^-?\d+$"             //匹配整数,可以为负数

"^(-?\d+)(\.\d+)?$"    //匹配浮点数
"^\d+$"                //匹配非负整数

"^\d+(\.\d+)?$"        //匹配非负整数

"^[A-Za-z]+$"           //匹配大小写英文字母     

1.2 QRegExp::Wildcard

通配符只有?、*、[]三种.

  • ? 匹配任意单个字符,和 RegExp的"."相同
  • * 匹配任意一个字符序列. 和RegExp的".*"相同
  • [] 匹配一个定义的字符集合. 例如, [a-zA-Z\.]可以匹配 a到z之间任意一个字符和. [^a]匹配出小写a以外的字符.

1.3 QRegExp::FixedString

  • 这意味着要匹配的模式被解释为普通字符串,即特殊字符(例如反斜杠)不被转义

1.4 使用示例如下所示:

代码语言:javascript
复制
    /*只能匹配整数,\\d表示转义字符,C++用\\来表示\ */
    QRegExp regx("^-?\\d+$");
    QValidator *validator = new QRegExpValidator(regx, this );
    ui->lineEdit->setValidator( validator );        //设置lineEdit只能输入数字

    QStringList list;
    list<<"123";
    list<<"123A456";
    list<<"555a";
    list<<"89d";
    list<<"3695x";
    list<<"69";
    list<<"78.9";

    foreach(QString s, list.filter(regx)){      //匹配字符串list
        qDebug()<<s;      //过滤数字,只打印123、69
    }


    //检索str时
    QString str = "-123";
    qDebug()<<str.contains(regx);       //返回true

    QRegExp regx2("-?\\d+");
    str = "number : -123xx";
    qDebug()<<str.indexOf(regx2);       //"-123"的位置在索引9上, QRegExp的缺点就是匹配到起始索引后,无法得到终点索引.

正则表达式讲解链接:https://deerchao.net/tutorials/regex/regex.htm

2.QRegularExpression

QRegularExpression 是Qt 5.0引进的,修复了很多bug,提高了效率,使用时建议使用QRegularExpression。

使用时,只需要构造QRegularExpression类,然后通过match函数来匹配目标字符串即可,match函数如下所示:

代码语言:javascript
复制
QRegularExpressionMatch match(const QString &subject,        //被匹配的目标字符串
                             int offset = 0,               //匹配的字符串起始位置
                            MatchType matchType  = NormalMatch, //匹配类型
                           MatchOptions matchOptions = NoMatchOption) const;// 匹配选项

其中QRegularExpressionMatch类,常用函数如下所示:

  • bool hasMatch() : 判断是否匹配
  • QString captured(int nth = 0) : 获取匹配到的第nth个集合段.
  • int capturedStart(int nth = 0) : 获取匹配到的第nth个集合段的起始索引
  • int capturedLength(int nth = 0) :获取匹配到的第nth个集合段的长度
  • int capturedEnd(int nth = 0) : 获取匹配到的第nth个集合段的终点索引

示例如下所示:

代码语言:javascript
复制
      QRegularExpression re("(\\d+)/(\\d+)/(\\d+)");
      QRegularExpressionMatch match = re.match("1999/12/11");
      if (match.hasMatch()) {
         for(int i = 0; !match.captured(i).isEmpty(); i++)
         {
            qDebug()<<"index="<<i<<",str="<<match.captured(i)<<",offset:"<<match.capturedStart(i)<<match.capturedEnd(i);
         }
      }

打印如下所示:

代码语言:javascript
复制
index= 0 ,str= "1999/12/11" ,offset: 4 14

index= 1 ,str= "1999" ,offset: 4 8

index= 2 ,str= "12" ,offset: 9 11

index= 3 ,str= "11" ,offset: 12 14

因为() 表示一个集合,所以除了匹配(\\d+)/(\\d+)/(\\d+)外,还会再次匹配3个圆括号里的内容,所以就有4个captured

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-12-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档