Qt正则表达式使用举例

 更新时间:2024年02月19日 15:16:49   作者:骆驼胡杨  
这篇文章主要给大家介绍了关于Qt正则表达式使用的相关资料,Qt中的正则表达式模式匹配功能由QRegExp类实现,它完全支持Unicode,并可以应用于字符串验证、搜索、查找替换和分割等场景,需要的朋友可以参考下

正则表达式

  • 正则表达式即一个文本匹配字符串的一种模式,Qt中QRegExp类实现使用正则表达式进行模式匹配,且完全支持Unicode,主要应用:字符串验证、搜索、查找替换、分割。

  • 正则表达式中字符及字符集

    -

  • 正则表达式中的量词

    -

  • 正则表达式中的断言

    -

  • QRegExp同时支持通配符

    -

  • 新建控制台应用程序,项目名QRegExp
    编辑main.cpp文件

    //匹配字符
        QRegExp ret("a");
        qDebug() << "是否匹配成功: " << ret.exactMatch("abc");    //false
        qDebug() << "是否匹配成功: " << ret.exactMatch("a");      //true
    
    //匹配数字
        QRegExp retNum("(\\d*\\D{2})");
        qDebug() << "是否匹配成功: " << retNum.exactMatch("120kg");    //true
        qDebug() << "是否匹配成功: " << retNum.exactMatch("180cm");    //true
        qDebug() << "是否匹配成功: " << retNum.exactMatch("3M");       //false
    
    //匹配通配符
        QRegExp re("*.txt") ;
        re.setPatternSyntax(QRegExp::Wildcard); //支持通配符
        qDebug() << "通配符匹配: " << re.exactMatch("a.txt");         //true
        qDebug() << "通配符匹配: " << re.exactMatch("a.txt.bak");     //false
    
    //匹配单词边界
        QRegExp reg("\\b(hello|Hello)\\b");
        qDebug() << "多个单词匹配: " << reg.indexIn("helloEveryone");     //-1表示失败
        qDebug() << "多个单词匹配: " << reg.indexIn("Hmm Hello Everyone");//4 表示匹配到的字符位置
    
    //匹配捕获的文本
    //以 "(?:" 开始, 以 ")" 结束
        QRegExp regHeight("(\\d+)(?:\\s*)(cm|inch)");
        int res = regHeight.indexIn("zhangsan 170cm");
        if(res > -1){
            qDebug() << "regHeight(0):" << regHeight.cap(0);    //170cm
            qDebug() << "regHeight(1):" << regHeight.cap(1);    //170
            qDebug() << "regHeight(2):" << regHeight.cap(2);    //cm
        }
    
    //断言 (?!) 表示:不紧跟才能匹配
        QRegExp regAssertFalse("面(?!包)");
        QString str = "面包没了,只剩面条了";
        str.replace(regAssertFalse, "龙虾鲍鱼");
        qDebug() << str;    //输出: "面包没了,只剩龙虾鲍鱼了"
    	
    //断言 (?=) 表示:紧跟才匹配
        QRegExp regAssertTrue("面(?=包)");
        QString str1 = "面包没了,只剩面条了";
        str1.replace(regAssertTrue, "草");
        qDebug() << str1;    //输出: "龙虾鲍鱼没了,只剩面条了"
    

qt5新类

 //Qt5新类
    QRegularExpression regExp("hello");
    qDebug() << "QRegularExpression匹配字符: " <<regExp.match("hello world"); //输出(0, 5, "hello")

    regExp.setPattern("([A-Z]{3,8})");
    regExp.setPatternOptions(QRegularExpression::CaseInsensitiveOption);    //大小写不敏感

    qDebug() << "大小写不敏感匹配字符: " <<regExp.match("hello");

    //新类捕获匹配
    QRegularExpression regExp1("^(\\d\\d\\d\\d)/(\\d\\d)/(\\d\\d)$");
    QRegularExpressionMatch match0 = regExp1.match("2022/04/04");

    if(match0.isValid()){
        QString strMatch0 = match0.captured(0);
        QString year = match0.captured(1);
        QString month = match0.captured(2);
        QString day = match0.captured(3);

        qDebug() << "日期: " << strMatch0;
        qDebug() << "年: " << year;
        qDebug() << "月: " << month;
        qDebug() << "日: " << day;
    }

    QString sPattern;
    sPattern = "^(Jan|Feb|Mar|Apr|May) \\d\\d \\d\\d\\d\\d$";
    QRegularExpression regDate(sPattern);

    QString ss("Feb 02 2022");
    QRegularExpressionMatch dateMatch;
    dateMatch = regDate.match(ss, 0,
                              QRegularExpression::PartialPreferCompleteMatch); //部分匹配
    bool b_HasMatched = dateMatch.hasMatch();        //完整匹配的返回值
    bool b_Partial = dateMatch.hasPartialMatch();    //部分匹配的返回值

    qDebug() << b_HasMatched;
    qDebug() << b_Partial;

附正则表达式提取字符串中的数字方法 :

QString WndName("WndName1"); 
QRegExp rx("\\d+");
QString wndIndex;
rx.indexIn(WndName,0);
wndIndex=rx.cap(1);
qDebug()<<wndIndex;

正则表达式从一个字符串里提取特定的字段或数据 例如从"a=100"里提取"a"和"100" :

QString pattern("(.*)=(.*)");  
QRegExp rx(pattern);  
  
QString str("a=100");  
int pos = str.indexOf(rx);              // 0, 第一个的位置
                                        // 如果找不到str,则返回-1
                                        // 你也可以使用rx.indexin(str)
qDebug() << pos;  
if ( pos >= 0 )  
{  
    qDebug() << rx.matchedLength();     // 5, 匹配字符串到最后的长度
                                        // 或者-1如果没有匹配
    qDebug() << rx.capturedTexts();     // QStringList("a=100", "a", "100"),  
                                        //   0: 文本匹配模式
                                        //   1: 第一个()捕获的文本
                                        //   2: 第二个文本的捕获 
  
    qDebug() << rx.cap(0);              // a=100, 文本匹配模式  
    qDebug() << rx.cap(1);              // a, 第n个()捕获的文本  
    qDebug() << rx.cap(2);              // 100,  
  
    qDebug() << rx.pos(0);              // 0, 第n个捕获文本的位置
    qDebug() << rx.pos(1);              // 0  
    qDebug() << rx.pos(2);              // 2  
}

总结 

到此这篇关于Qt正则表达式使用的文章就介绍到这了,更多相关Qt正则表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用C语言实现五子棋游戏

    利用C语言实现五子棋游戏

    这篇文章主要为大家详细介绍了利用C语言实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C++二叉树实现词频分析功能

    C++二叉树实现词频分析功能

    这篇文章主要为大家详细介绍了C++二叉树实现词频分析功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • C++全密码生成的实现代码

    C++全密码生成的实现代码

    这篇文章主要为大家详细介绍了C++全密码生成的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • C语言进阶教程之字符函数&字符串函数

    C语言进阶教程之字符函数&字符串函数

    C语言提供了丰富的字符串处理函数,可以对字符串进行输入、输出、合并、修改、比较、转换、复制、搜索等操作,下面这篇文章主要给大家介绍了关于C语言进阶教程之字符函数&字符串函数的相关资料,需要的朋友可以参考下
    2022-03-03
  • C++智能指针的补充和特殊类的设计示例详解

    C++智能指针的补充和特殊类的设计示例详解

    智能指针不仅能够有效避免内存泄漏,还能简化代码逻辑,提升程序的健壮性和可维护性,这篇文章主要介绍了C++智能指针的补充和特殊类设计的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-11-11
  • C语言数据的存储超详细讲解下篇浮点型在内存中的存取

    C语言数据的存储超详细讲解下篇浮点型在内存中的存取

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-04-04
  • Qt实现制作简单的计算器

    Qt实现制作简单的计算器

    计算器是我们生活中很常见的东西,它可以由多种语言多种方式来实现。本文主要介绍的是利用Qt实现的简易计算器的制作,文中的示例代码讲解详细,需要的可以参考一下
    2022-12-12
  • C语言嵌入informix基础入门示例讲解

    C语言嵌入informix基础入门示例讲解

    这篇文章主要介绍了C语言嵌入informix基础方法,大家参考使用
    2013-11-11
  • C++类的大小介绍

    C++类的大小介绍

    这篇文章主要介绍了C++类的大小,在C++中,结构体和类的唯一区别就是结构体和类具有不同的默认访问控制属性,下面一起进入文章查看详细内容
    2021-11-11
  • 如何通过C++求出链表中环的入口结点

    如何通过C++求出链表中环的入口结点

    本文主要介绍了通过C++求解链表中环的入口结点,即给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。需要的朋友可以参考一下
    2021-12-12

最新评论