• QRegExp(正则表达式)


    QRegExp

    头文件:#include

    构造函数:

    常用函数:

    indexIn()判断是否符合规则
    matchedLength()返回最后一个匹配字符串的长度,没有的话返回-1
    setPattern()将模式字符串设置为模式。区分大小写、通配符和最小匹配选项不会更改
    swap()交换正则表达式
    replace()替换字符
    setMinimal(bool)设置是否为贪婪   true为懒惰,flase为贪婪(默认)
    setPatternSyntax(QRegExp::RegExp)设置正则语法模式
    pattern()返回该正则表达式
    exactMatch()返回字符串是否匹配,匹配返回true,不匹配返回false
    cap()捕获(返回由第 n 个子表达式捕获的文本)第一个元素 cap(0) 是整个匹配字符串。每个后续元素对应于下一个捕获左括号。因此,cap(1) 是第一个捕获括号的文本,cap(2) 是第二个捕获括号的文本
    captureCount()返回正则表达式中包含的捕获数。
    captrueTexts()返回捕获的文本字符串的列表
    setCaseSensitivity(Qt::CaseInsensitive)设置不区分大小写
    pos()返回搜索字符串中捕获的第 n 个文本的位置
    escape()返回转义后的字符字符串

     setPatternSyntax(QRegExp::RegExp)

    QRegExp::RegExp默认
    QRegExp::RegExp2和第一个一样但有贪婪的量词
    QRegExp::Wildcard这提供了一个简单的模式匹配语法,类似于 shell
    QRegExp::WildcardUnix这类似于通配符,但具有Unix shell的行为。通配符可以使用字符“\”进行转义。
    QRegExp::FixedString模式是一个固定字符串。这相当于在字符串上使用 RegExp 模式,其中所有元字符都使用escape() 进行转义
    QRegExp::W3CXmlSchema11该模式是由 W3C XML 架构 1.1 规范定义的正则表达式。

     c++使用 \d \w \s 这些需要使用转义字符 变为  \\d \\w \\s

    QRegExp rx("^\\d\\d?$") //以两个数字为数字,第二个可以不用

    函数的使用:

    indexIn()函数的使用

    indexIn(constQString&str,intoffset= 0,QRegExp::CaretModecaretMode= CaretAtZero) 

    • str 需要匹配的字符串
    • offset  偏移量默认为0, 0的话为第一个开始,-1从最后一个开始,-2倒数第二个开始
    • 返回的结果 -1 不匹配    匹配的话返回匹配的位置
    1. QRegExp exp("^\\d$|^[1-9][0-9]$|^100$");//匹配[0-100]
    2. qDebug()<<exp.indexIn("-1");//不匹配
    3. qDebug()<<exp.indexIn("0");
    4. qDebug()<<exp.indexIn("50");
    5. qDebug()<<exp.indexIn("100");
    6. qDebug()<<exp.indexIn("200");//不匹配

     

     setPattern()函数的使用

    用来设置一个regexp

    1. QRegExp exp("^\\d$|^[1-9][0-9]$|^100$");//匹配[0-100]
    2. exp.setPattern("\\b12\\b");//输入一个regexp,匹配12
    3. qDebug()<<exp.indexIn("mmm mmm 12");//位置为8
    4. qDebug()<<exp.indexIn("mm 12");//位置为3
    5. qDebug()<<exp.indexIn("12");//位置为0
    6. qDebug()<<exp.indexIn(" 12");//位置为1

     

     replace()函数的使用:

    用来替换所匹配的字符

    1. QRegExp exp("^\\d$|^[1-9][0-9]$|^100$");//匹配[0-100]
    2. exp.setPattern("M(?!ail)"); //匹配字符,M后面不能跟有ail
    3. QString str="abcdM";
    4. str.replace(exp,"Mail");//把匹配到的字符替换为Mail
    5. qDebug()<<str;

     

     

     统计匹配的个数

    1. exp.setPattern("\\bab\\b|\\bcd\\b");//匹配ab或cd
    2. QString str1="ab cd ef g ab cd";
    3. int pos=0;
    4. int count=0;
    5. while(pos>=0)
    6. {
    7. pos=exp.indexIn(str1,pos);获取匹配的索引
    8. if(pos>=0)
    9. {
    10. ++pos;//从匹配字符的下一个开始匹配
    11. ++count;//匹配成功,个数+1
    12. }
    13. }
    14. qDebug()<<count;//输出数量

     

     setPatternSyntax(QRegExp::RegExp)的使用

    设置使用通配符

    1. exp.setPattern("*.txt");//匹配.txt结尾的
    2. exp.setPatternSyntax(QRegExp::Wildcard);//使用通配符
    3. qDebug()<<exp.exactMatch("p.txt");//true
    4. qDebug()<<exp.exactMatch("p.txt.p");//false

     

     cap()捕获的使用

    cap(0)表示完全匹配,会返回整个匹配结果,cap(1) 是第一个捕获括号的文本,cap(2) 是第二个捕获括号的文本

    cap(0)cap(1)cap(2) 的区别

    • 使用捕获的格式为:(E)
    • 使用非捕获格式为:(?:E) 非捕获效率比捕获高
    1. QRegExp exp2("(\\d+)(?:\\s*)(cm|inch)");
    2. int p2=exp2.indexIn("Length:198cm");
    3. if(p2>-1)
    4. {
    5. qDebug()<<exp2.cap(0);//输出全部匹配的内容
    6. qDebug()<<exp2.cap(1);//输出第一个匹配的内容
    7. qDebug()<<exp2.cap(2);//输出第二个匹配的内容
    8. }

     

     

    遍历:

    1. QRegExp exp1("(\\d+)");
    2. QString s1="1 2 3 45 678 999";
    3. QString list;
    4. int p1=0;
    5. while((p1=exp1.indexIn(s1,p1))!=-1)//遍历整个字符串
    6. {
    7. list.append(exp1.cap(1));//第一个捕获到的文本
    8. p1+=exp1.matchedLength();//获取上一个匹配的字符串长度
    9. }
    10. qDebug()<<list;

     

     pos函数的使用:

    1. QRegExp exp3("(\\d)\\s(\\d{2})");
    2. qDebug()<<exp3.indexIn("as 1 2 34 56 er");//符合条件的位置
    3. qDebug()<<exp3.pos(0);//符合条件的位置
    4. qDebug()<<exp3.pos(1);//捕获1的位置
    5. qDebug()<<exp3.pos(2);//捕获2的位置

     

     escape()函数的使用

    使用这函数方便了转义

    1. qDebug()<<QRegExp::escape("123");//无需转义
    2. qDebug()<<QRegExp::escape("()");//需转义
    3. qDebug()<<QRegExp::escape("[]");//需转义
    4. qDebug()<<QRegExp::escape("{}");//需转义
    5. qDebug()<<QRegExp::escape("f(x)");//需转义
    6. qDebug()<<QRegExp::escape("$");//需转义

     

     setMinimal(bool)贪婪的使用

    系统默认是贪婪的

    •  setMinimal(true)设置为懒惰
    1. QRegExp exp4("(0+)");
    2. int ppp=exp4.indexIn("00000");
    3. if(ppp!=-1)
    4. {
    5. qDebug()<<exp4.cap(1);//输出结果为00000
    6. }
    7. exp4.setMinimal(true);//设为懒惰
    8. int ppp1=exp4.indexIn("00000");
    9. if(ppp1!=-1)
    10. {
    11. qDebug()<<exp4.cap(1);//输出结果为0
    12. }

     

  • 相关阅读:
    (蓝桥杯第十四届c解法,部分题目)​一、冶炼金属​二、飞机降落
    C#编程题分享(2)
    大数据开发之Sqoop详细介绍
    hive元数据的mysql迁移和升级的流程方案
    433. 最小基因变化
    git撤回多个push到远程仓库的commit
    分析Python爬虫设计
    Embedding技术与应用 (2) :神经网络的发展及现代Embedding方法简介
    外包公司干了2个月,技术倒退两年...
    VS中属性页各种包含目录的区别
  • 原文地址:https://blog.csdn.net/qq_45303986/article/details/127871375