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语言中的time函数获取系统时间

    使用C语言中的time函数获取系统时间

    在C语言中可以使用time函数来获取系统时间,以下对time函数进行了介绍,需要的朋友可以过来参考下
    2013-07-07
  • C++提取文件名与提取XML文件的方法详解

    C++提取文件名与提取XML文件的方法详解

    这篇文章主要为大家详细介绍了C++提取文件名与提取XML文件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助<BR>
    2022-03-03
  • C++中静态库与动态库的使用示例

    C++中静态库与动态库的使用示例

    在C/C++中使用库的技术,库主要分为两种类型:静态库和动态库,本文主要介绍了C++中静态库与动态库的使用示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • C语言多文件编写详解

    C语言多文件编写详解

    这篇文章主要介绍了C语言多文件编写,是C语言入门学习中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助
    2021-09-09
  • C语言实现一个简单的扫雷游戏

    C语言实现一个简单的扫雷游戏

    扫雷是电脑上很经典的游戏,特意去网上玩了一会,几次调试之后,发现这个比三子棋要复杂一些,尤其是空白展开算法上和堵截玩家有的一拼,与实际游戏差别较大,不能使用光标,下面来详解每一步分析
    2021-10-10
  • QT实战之实现图片浏览系统

    QT实战之实现图片浏览系统

    这篇文章主要介绍了如何利用QT编写一个图片浏览系统,可以支持自动播放,左右拖动切换,点击列表切换,点击按钮切换等功能,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-04-04
  • C语言中传值与传指针的介绍与区别

    C语言中传值与传指针的介绍与区别

    这篇文章主要给大家介绍了关于C语言中传值与传指针的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • C/C++实现segy文件的读取详解

    C/C++实现segy文件的读取详解

    SEGY是地震数据一般以地震道为单位进行组织,采用SEG-Y文件格式存储。标准SEGY文件一般包括三部分:卷头、道头与地震道数据。本文将介绍利用C++读取segy文件的方法,感兴趣的可以了解一下
    2022-03-03
  • C语言简明讲解快速排序的应用

    C语言简明讲解快速排序的应用

    快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影
    2022-05-05
  • C++ Boost MetaStateMachine定义状态机超详细讲解

    C++ Boost MetaStateMachine定义状态机超详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-12-12

最新评论