zoukankan      html  css  js  c++  java
  • 59.QT-QRegExp和QRegularExpression

    1.QRegExp

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

    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  匹配数字
    • 匹配单词的开始或结束
    •   匹配字符串的开始
    •   匹配字符串的结束
    • [] 匹配括号内输入的任意字符.    例如[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  匹配任意不是字母,数字,下划线,汉字的字符
    • 匹配任意不是空白符的字符
    • D  匹配任意非数字的字符
    • B  匹配不是单词开头或结束的位置
    • [^x]   匹配除了x以外的任意字符
    • [^aeiou]   匹配除了aeiou这几个字母以外的任意字符

    元字符转义:

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

    元字符使用示例:

    ^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 使用示例如下所示:

        /*只能匹配整数,\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函数如下所示:

    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个集合段的终点索引

    示例如下所示:

          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);
             }
          }

    打印如下所示:

    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

  • 相关阅读:
    利用JNI技术在Android中调用、调试C++代码
    iOS在线更新framework,使用NSBundle动态读取
    CocoaPods pod install
    Quartz 2D在ios中的使用简述二:创建画布
    iOS并发编程笔记【转】
    openCV C++ 代码笔记
    Quartz 2D在ios中的使用简述一:坐标体系
    ios视频播放器,代码和界面分离
    mac显示和隐藏文件
    3点画圆
  • 原文地址:https://www.cnblogs.com/lifexy/p/14141105.html
Copyright © 2011-2022 走看看