QRegexp、QRegularExpression的用法学习

2023-11-19

QRegexp、QRegularExpression的用法学习

QRegexp

  • Regexp 由表达式(expressions) 量词(quantifiers) 断言(assertions)
int QRegExp::indexIn()		//匹配成功返回索引   失败 -1
setPattern() 		//输入一个RegExp
replace()    //匹配替换
“^” 在“[]”中开始的位置  表达相反的意思 如[^abc] 匹配除abc以外的字符
“-”   表示一个范围的字符   [A-Z];

在这里插入图片描述
在这里插入图片描述

  • E 代表一个表达式 一个表达式可以是一个字符,或者每一个字符集缩写或者 方括号中的一个字符集,或者括号中的一个表达式

  • 量词一般是”贪婪的“(尽可能的去匹配多个) setMinimal (true) 设置为”非贪婪”

  • E{n,m} : "n"表示匹配至少匹配 n次 "m"表示至多匹配 m次
    在这里插入图片描述

  • 断言 不匹配任何字符
    在这里插入图片描述

QRegExp re("^\\d\\d?$");            // ^字符串开头   $字符串结尾 字面意思  匹配规则 两个纯数字
qDebug()<<re.indexIn("1c");
qDebug()<<re.indexIn("9");
qDebug()<<re.indexIn("c2");
qDebug()<<re.indexIn("23");
qDebug()<<re.indexIn("256");

qDebug()<<"******************";
re.setPattern("\\b(mail|letter)\\b");        // \b匹配字符串边界  \转义字符
qDebug()<<re.indexIn("emailletter");
qDebug()<<re.indexIn("my mail");
qDebug()<<re.indexIn("my email letter");

qDebug()<<"******************";
re.setPattern("Q(?!t)");
QString str = "Hi I'm Q";
str.replace(re,"Qt");
qDebug()<<"str:"<<str;
QString str2="I used Q,your used Q too,his used Qt";
str2.replace(re,"Qt");
qDebug()<<"str2:"<<str2;
qDebug()<<"******************";
QString str3="One Eric another Eirik, and an Ericsson"
    "How many Eiriks,Eric?";
QRegExp re2("\\bEi?ri[ck]\\b");             //  匹配E ric Ei rik
int pos =0;
int count = 0;
while (pos >=0)
{
    pos = re2.indexIn(str3,pos);
    if(pos >=0)
    {
        ++pos;
        ++count;
    }
}
qDebug()<<"count:"<<count;
  • setPatternSyntax() //切换不同的匹配方式

  • 在这里插入图片描述

  • 通配符 一种比QRegExp 更简单的匹配方式
    -在这里插入图片描述

    //通配符
    qDebug()<<"********************";
    QRegExp re3("*.txt");
    re3.setPatternSyntax(QRegExp::Wildcard);  //通配符
    qDebug()<<re3.exactMatch("readme.txt");
    qDebug()<<re3.exactMatch("welcome.txt.bat");
    
  • cap() 0 全匹配 1左边第一个括号的匹配结果 捕获匹配结果

    qDebug()<<"********************";
    //文本捕获
    QRegExp re4("(\\d+)");
    QString str4="Offsets:12 14 99 256 99";
    QStringList list;
    int pos2 =0;
    
    while((pos2=re4.indexIn(str4,pos2)) !=-1)
    {
    list<<re4.cap(1);                   //捕获到的第一个文本
    pos2 +=re4.matchedLength();         //上一个匹配到的字符串的长度
    
    }
    qDebug()<<list;
    QRegExp relen("(\\d+)(?:\\s*)(cm|inch)");
    int pos3=relen.indexIn("Length: 189cm");
    if(pos3>-1)
    {
    QString value =relen.cap(1);
    QString unit = relen.cap(2);
    QString string = relen.cap(0);
    qDebug()<<value<<unit<<string;
    }
    QRegExp re5("\\b(\\w+)\\W+\\1\\b");
    re5.setCaseSensitivity(Qt::CaseInsensitive);   //不区分大小写
    qDebug()<<re5.indexIn("Hello--hello");
    qDebug()<<re5.cap(0);
    qDebug()<<re5.cap(1);
    QRegExp re6("\\b你好\\b");
    qDebug()<<re6.indexIn("你好");
    qDebug()<<re6.cap(0);       //整个字符串完全匹配  使用cap(0) 捕获
    

QValidator 验证器

QRegularExpression

模式选项

在这里插入图片描述
在这里插入图片描述

//方式一
QRegularExpression re("Qt rocks",QRegularExpression::CaseInsensitiveOption);
//方式二
QRegularExpression re("^\\d+$")
re.setPatternOptions(QRegularExpression::CaseInsensitiveOption);
QRegularExpression::PatternOptions  options =re.patternOptions()   //获取模式设置
//QRegularExpression
qDebug()<<"******************";
QRegularExpression regexp("^(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)$");
QRegularExpressionMatch match = regexp.match("28/10/2020");
if(match.hasMatch())
{
QString matched = match.captured(0);
QString day = match.captured(1);
QString month = match.captured(2);
QString year = match.captured(3);
qDebug()<<"matched:"<<matched;
qDebug()<<"day:"<<day;
qDebug()<<"month :"<<month;
qDebug()<<"year :"<<year;
}

QString pattern("^(Jan|Feb|Mar|APr|May)\\s\\d\\d?,\\d\\d\\d\\d$");
QRegularExpression rel(pattern);
QString input("Jan 21,2020");
QRegularExpressionMatch match1 = rel.match(input,0,QRegularExpression::PartialPreferCompleteMatch);
bool hasMatch = match1.hasMatch();         //完全匹配
bool hasPartialMath = match1.hasPartialMatch();    //返回部分匹配结果
qDebug()<<"部分匹配的全部结果"<<match1.captured(0);
qDebug()<<"hasMatch:"<<hasMatch<<"hasPartialMath:"<<hasPartialMath;

QRegularExpression ret("\\d\\d\\w+");
QRegularExpressionMatch match2=ret.match("12 abd 56 def",1);   //设置偏移为1  会跳过第一个匹配到的数据
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QRegexp、QRegularExpression的用法学习 的相关文章

随机推荐

  • CTex的基本用法

    主要内容 Latex简介 命令和环境 文档排版和组织 普通文本编辑 数学公式编辑 图形 插图 表格 文献等的编辑 一 Latex简介 1 概述 首先要从TEX介绍起 TEX是斯坦福大学的教授Donald E Knuth 图灵奖获得者 开发的
  • django.db.utils.DataError: (1406, “Data too long for column ‘name‘ at row 1“)

    报错现象 django db utils DataError 1406 Data too long for column name at row 1 排除故障 当时第一反应是上网百度 结果搜出来的结果都是改字符集 但明显我这个和字符集关系不
  • 单片机语音识别原理

    语音识别是一门交叉学科 近二十年来 语音识别技术取得显著进步 开始从实验室走向市场 人们预计 未来10年内 语音识别技术将进入工业 家电 通信 汽车电子 医疗 家庭服务 消费电子产品等各个领域 语音识别听写机在一些领域的应用被美国新闻界评为
  • 基于SSM框架的多文件上传Controller类编写

    前端代码
  • Spring Boot 从Json静态文件中读取数据

    Spring Boot 从Json静态文件中读取数据 在实体中 通常使用类似字典表的文件来表示属性 文件大都配置在配置文件中 也可以是静态文件 本次记录如何从静态json文件中读取所需字段 1 文件格式以及路径 2 加载文件 import
  • QT进程间通信 详细介绍

    在QT中 信号和槽的机制取代了这种繁杂的 易崩溃的对象通信机制 信号是当对象状态改变时所发出的 槽是用来接收发射的信号并响应相应事件的类的成员函数 信号和槽的连接是通过connect 函数来实现的 AD 1 QT通信机制 为了更好的实现QT
  • MVC三层架构

    1 什么是MVC Model View Controller 模型 视图 控制器 模型就是Java对应数据库的那些字段 实体类 视图 就是JSP页面 控制器 就是Servlet负责跳转页面 Controller作用 Controller其实
  • Android addview—动态添加view

    一 前言 在日常的开发中经常遇到需要动态添加子view的情况 addview是ViewGroup的特有方法 可以在布局中动态添加view 而view是不存在这个方法的 二 使用方式 1 方法介绍 addview有以下几种方式 addView
  • vue+websocket+express+mongodb实战项目(实时聊天)(二)

    原项目地址 vue websocket express mongodb实战项目 实时聊天 一 http blog csdn net blueblueskyhua article details 70807847 github地址 https
  • JAVA按钮编程_Java编程实现swing圆形按钮实例代码

    Swing是一个为Java设计的GUI工具包 Swing是JAVA基础类的一部分 Swing包括了图形用户界面 GUI 器件如 文本框 按钮 分隔窗格和表 Swing提供许多比AWT更好的屏幕显示元素 它们用纯Java写成 所以同Java本
  • Linux——pthread_create()

    1 pthread create pthread create是 Unix Linux Mac OS X 等操作系统的创建线程的函数 它的功能是创建线程 实际上就是确定调用该线程函数的入口点 在线程创建以后 就开始运行相关的线程函数 函数原
  • KITTI SOTA!Dual Fusion:减少Lidar-Camera融合特征不对齐问题

    点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 多传感器融合 技术交流群 后台回复 多传感器融合综述 获取图像 激光雷达 毫米波雷达融合综述等干货资料 摘要 融合来自相机和激光雷达传感器的数据是
  • 基于ICL8038的正弦波、方波和三角波发生器protues仿真设计

    一 设计任务与要求 设计 组装 调试信号发生器电路 使它能输出正弦波 方波和三角波 可采用集成芯片ICL8083 其频率在20HZ 20KHZ范围内连续可调 输出正弦波 方波 三角波 正弦波 二 原理电路设计 1 设计方案 方案的结构框图如
  • ToBase64String方法 - 理想的地方的日志 - 网易博客

    用ToBase64String方法可以在不丢失数据的情况下将字节数组转成字符串 在ToBase64String方法中 会对字节数组中的连续三字节进行一次编码 编码得的字符串长度为4位 而且得出来的4位的字符串里面的字符肯定是由大小写字母 数
  • 如何发现系统改进点,优化点,提高点,新系统 边界感不要太强

    技术人员规划能力 如何规划新的系统 技术规划能力 个人渣记录仅为自己搜索用的博客 CSDN博客 1 协作中 双方系统对接 边界感不要太强 肯定会不爽 不爽的点里可以挖掘改进点 肯定会有很多冲突 对方技能欠缺 对方耽误你的时间 可以想下有没有
  • 三分钟阿里云服务器u1通用算力型性能、使用限制及费用说明

    阿里云服务器u1是通用算力型云服务器 CPU采用2 5 GHz主频的Intel R Xeon R Platinum处理器 通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景 比如业务HA
  • 关于人脸识别的心得随笔(持续更新)

    2020 4 25 目前 在监控系统图像中 可以将肤色作为人脸识别的依据 RGB颜色空间是由三基色组成 亮度色度混合 肤色聚集效果差 需要转换到亮度与色度分离的模型 HSV模型 其中的脸部区域像素H分量中 效果最佳 已知的数据降维的算法有
  • Connection.setAutoCommit使用的注意事项

    setAutoCommit总的来说就是保持数据的完整性 一个系统的更新操作可能要涉及多张表 需多个SQL语句进行操作 循环里连续的进行插入操作 如果你在开始时设置了 conn setAutoCommit false 最后才进行conn co
  • Spring-messaging (STOMP) @SendTo 与 @SendToUser的区别

    SendTo 与 SendToUser 是Spring的STOMP协议中注解的标签 SendTo 会将接收到的消息发送到指定的路由目的地 所有订阅该消息的用户都能收到 属于广播 SendToUser 消息目的地有UserDestinatio
  • QRegexp、QRegularExpression的用法学习

    QRegexp QRegularExpression的用法学习 文章目录 QRegexp QRegularExpression的用法学习 QRegexp QRegularExpression 模式选项 QRegexp Regexp 由表达式