QRegExp(正则表达式)

QRegExp

头文件:#include<QRegExp>

构造函数:

常用函数:

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 不匹配    匹配的话返回匹配的位置
    QRegExp exp("^\\d$|^[1-9][0-9]$|^100$");//匹配[0-100]
    qDebug()<<exp.indexIn("-1");//不匹配
    qDebug()<<exp.indexIn("0");
    qDebug()<<exp.indexIn("50");
    qDebug()<<exp.indexIn("100");
    qDebug()<<exp.indexIn("200");//不匹配

 

 setPattern()函数的使用

用来设置一个regexp

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

 

 replace()函数的使用:

用来替换所匹配的字符

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

 

 

 统计匹配的个数

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

 

 setPatternSyntax(QRegExp::RegExp)的使用

设置使用通配符

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

 

 cap()捕获的使用

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

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

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

 

 

遍历:

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

 

 pos函数的使用:

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

 

 escape()函数的使用

使用这函数方便了转义

    qDebug()<<QRegExp::escape("123");//无需转义
    qDebug()<<QRegExp::escape("()");//需转义
    qDebug()<<QRegExp::escape("[]");//需转义
    qDebug()<<QRegExp::escape("{}");//需转义
    qDebug()<<QRegExp::escape("f(x)");//需转义
    qDebug()<<QRegExp::escape("$");//需转义

 

 setMinimal(bool)贪婪的使用

系统默认是贪婪的

  •  setMinimal(true)设置为懒惰
    QRegExp exp4("(0+)");
    int ppp=exp4.indexIn("00000");
    if(ppp!=-1)
    {
        qDebug()<<exp4.cap(1);//输出结果为00000
    }
    exp4.setMinimal(true);//设为懒惰
    int ppp1=exp4.indexIn("00000");
    if(ppp1!=-1)
    {
        qDebug()<<exp4.cap(1);//输出结果为0
    }

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值