首页 > 编程语言 >Qt正则表达式类QRegExp(附检验小程序)

Qt正则表达式类QRegExp(附检验小程序)

时间:2023-05-25 15:33:59浏览次数:42  
标签:字符 匹配 Qt 正则表达式 QRegExp 字符串 表达式



       在许多场景中,我们需要验证用户输入的数据是否有效,或者是查找并修改文本,或者是提取指定数据,为此,相对于Qstring的一些函数,QT提供了一个更加强大的类——QRegExp,使用函数配合正则表达式来操作字符串,QRegExp可以进行下面的操作,并附带检验小程序,可在文末下载。

Qt正则表达式类QRegExp(附检验小程序)_字符串


一.正则表达式相关函数用法

1.提取数据

matchedLength() 匹配的长度

capturedTexts() 捕捉到的字符串列表,   对应的还有captureCount() ,获取表达式中含有的捕捉组的数目

cap(int n) 第n个组的内容(0代表匹配自身)

  • cap()参数缺省值为0。
  • cap(0):表示匹配的整个文本的值。
  • cap(1):表示第1个圆括弧中的值。
  • cap(2):表示第2个圆括弧中的值。

pos(int n) 第n个组的位置(默认值为0)

QRegExp::indexIn() 搜索字符串以找到匹配的字串,返回索引值,失败返回-1

QRegExp::lastIndexIn() 同上,只是从后向前搜索

QString str = "(.*)=(.*)";
        QRegExp rx_1(str);
        QString str_1 = ("a=100");
        int pos = rx_1.indexIn(str_1);
        if(pos>=0)
        {
            qDebug()<<rx_1.matchedLength(); //5
            qDebug()<<rx_1.capturedTexts(); //("a=100", "a", "100")
            qDebug()<<rx_1.cap(0);//"a=100"
            qDebug()<<rx_1.cap(1);//"a"
            qDebug()<<rx_1.cap(2);//"100"
            qDebug()<<rx_1.pos(0);//0
            qDebug()<<rx_1.pos(1);//0
            qDebug()<<rx_1.pos(2);//2
        }

(?:pattern)是非捕获型括号 匹配pattern,但不捕获匹配结果(pattern)是捕获型括号。 匹配pattern,匹配pattern并捕获结果,自动获取组号(?<name> pattern ) 匹配pattern, 匹配pattern并捕获结果,设置name为组名例如,将(.*)=(.*)改为(?:.*)=(.*),qDebug()<<rx_1.cap(1);该值将为100,而 qDebug()<<rx_1.cap(2);将为空。


2.修改文本

       将匹配到的字符串替换成其他字符串,例如将文本中的a=100修改为b=100

QString str = "a=100";
s.replace(QRegExp("(.*)="),"b=");

       将匹配到的字符串内容进行自定义或替换,例如将文本中的a=100修改为100=a

Qstring str = "a=100";
s.replace(QRegExp("(.*)=(.*)"),"\\2=\\1");// \\1就是相当于cap(1),表示第1个圆括弧中的值。

3.验证文本有效性

       这里用到QRegExp::exactMatch来判断输入的字符是否符合正则表达式。

QRegExp::exactMatch() 判断字符串是否完全(从头到尾)匹配,返回真或假

QRegExp rx("\\d"); //正则表达式
    bool match = rx.exactMatch("8");//验证文本
    if(match == true)
    {
        //表达式正确

        return;
    }
        //表达式错误

对此,QRegExp都有相对应的函数方法,还有一些函数上面没有写出来,例如:

isValid();//判断正则表达式是否合法,合法返回true,否则返回false。
pattern();//获得正则本身

其他完整函数,大家可在文末点击官方文档查阅,当然,所有的函数方法都离不开一个核心就是正则表达式,我们来看下。


二.正则表达式

正则表达式是由表达式+量词+断言组成。

首先是表达式:

例子

含义

c

除非具有特殊的正则表达式含义(., ^, $, [, ], * , +, ? ),否则字符表示自身。例如c匹配字符c

\c

除以下指定的字符外,反斜杠后面的字符与字符本身匹配。例如,要匹配字符串开头的文字插入符,请写\ ^

\a

匹配ASCII铃声(BEL,0x07)

\f

匹配ASCII换页(FF,0x0C)

\n

匹配ASCII换行符(LF,0x0A,Unix换行符)

\r

匹配ASCII回车(CR,0x0D)

\t

与ASCII水平制表符(HT,0x09)匹配

\v

匹配ASCII垂直制表符(VT,0x0B)。

.(dot)

匹配任何字符(包括换行符)

\d

匹配一个数字

\D

匹配一个非数字。

\s

匹配一个空白字符

\S

匹配非空格字符。

\w

任意单字字符(字母,数字或者下划线)

\W

任意非单字字符

\n

第n个反向引用,例如\ 1,\ 2等。

注意: C ++编译器将反斜杠转换为字符串。要将\包含在正则表达式中,请输入两次,即\\。要匹配反斜杠字符本身,请输入四次,即\\\\。

最简单的一个正则表达式就是字符,例如:

  • a 匹配字符a
  • b 匹配字符b
  • 9 匹配数字9

表达式后面可以加量词,默认情况下,表达式会自动由{1,1}进行量化,即它应该只出现一次。在下面的列表中,E代表表达。表达式是一个字符,或者是一组字符的缩写,或者在方括号中是一组字符,或者在括号中是表达式。

例子

解释

E?

?代表0个或1个

E*

*代表0个或1个或多个

E+

+代表1个或多个

E{3}

匹配3次

E{3,}

匹配大于等于3次

E{,6}

匹配至多m次,等价于a{0,m}

E{3,6}

匹配至少3次,至多6次(包括3和6)

例如:

  • E?匹配0次或者1次E
  • E+ 匹配1次或者多次E
  • E{3,6} 匹配至少3次,至多6次E

可以在表达式和量词的基础,加入断言,进行一些限制,例如我们想要匹配0-9,我们可以将正则表达式写为/d,如果我们想要匹配0-99,我们可以写成[0-9]{1,2},这时,字符串“89”符合,字符串“我们今年21岁了”也符合,因为里面有21,单独使用[0-9]{1,2},它会匹配包括出现在字符串中间的整数,如果想匹配的整数是整个字符串,那么就需要使用断言“^”和“$”了。
断言在正则表达式中出现的位置对文本进行一些声明,但不匹配任何字符。在以下列表中,E代表任何表达式。

例子

解释

^

尖号表示字符串的开头。如果您想匹配文字,则必须通过书写将其转义\。例如,^#include将仅匹配以字符’#include’开头的字符串。(当插入号是字符集的第一个字符时,它具有特殊含义,请参见字符集。)

$

美元表示字符串的结尾。例如,\ d \ s * Qt正则表达式类QRegExp(附检验小程序)_正则表达式_02,则必须通过书写将其转义\$。

\b

单词边界。例如,正则表达式\ bOK \ b表示在单词边界(例如字符串或空白的开头)之后立即匹配字母“ O”,然后紧接在另一个单词边界(例如字符串或空白的结尾)之前匹配字母“ K”。但是请注意,该断言实际上并不与任何空格匹配,因此如果我们编写(\ bOK \ b)并且具有匹配项,即使该字符串为“ It’s OK now”,它也将仅包含“ OK ”。

\B

非单词边界。只要\ b为假,该断言就为真。例如,如果我们在“ Left on”中搜索\ Bon \ B,则匹配将失败(字符串的空格和结尾不是非单词边界),但将在“ t on ne”中匹配。

(?= E)

如果表达式此时在regexp中匹配,则此断言为true。

(?!E)

如果此表达式在regexp中不匹配,则此断言为true。


除此之外,还有其他一些其他字符可以和表达式组合,方括号表示匹配方括号中包含的任何字符。上述字符集缩写可以出现在方括号中的字符集中。除字符集缩写和以下两个例外外,字符在方括号中没有特殊含义。

例子

含义

^

如果字符集作为第一个字符出现(即紧接在方括号之后),则插入符将否定该字符集。[ABC]匹配’a’或’b’或’c’的,但[^ ABC]匹配任何但’a’或’b’或’c’的。

-

破折号表示字符范围。[W-Z]与“ W”或“ X”或“ Y”或“ Z”匹配。

通配符匹配,大多数命令外壳(如bash或cmd.exe)都支持“文件通配”,即使用通配符标识一组文件的能力。所述setPatternSyntax()函数用于正则表达式和通配符模式之间切换。通配符匹配比完整的正则表达式简单得多,并且只有四个功能:

例子

解释

c

除了下面提到的那些字符以外,任何字符都代表自己。因此,c与字符c相匹配。

?

匹配任何单个字符。与相同。在完整的正则表达式中。

*

匹配零个或多个任何字符。与完整正则表达式中的。*相同。

[…]

字符集可以用方括号表示,类似于完整的正则表达式。在字符类中,与外部一样,反斜杠没有特殊含义。

其他一些组合

例子

解释

[abc]

方括号中间是几个字母,表示a,b,c这三个单独的字符

^abc

除了a,b,c以外的字符

[a-z]

匹配a到z之间(包括a和z)的所有单个字符

[a-zA-Z]

a到z,A到Z的所有单个字符

(a|b)

a或b


三.链接及下载

很多人找不到相对应的文档,这里大家可以注意下,例如我是qt5的,那么只需要doc.qt.io/qt-5/xxxxxxx.html,这里xxxxxxx只需要写对应的类名即可找到对应类的文档,QRegExp类使用正则表达式提供模式匹配。


标签:字符,匹配,Qt,正则表达式,QRegExp,字符串,表达式
From: https://blog.51cto.com/u_14770531/6348313

相关文章

  • 基于Qt的音乐播放器(三)通过酷狗音乐的api接口,返回json格式歌曲信息(播放地址,歌词,图片)
    2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票!我的投票地址:点击为我投票文章目录前言1.获取歌曲搜索列表api接口2.获取单个歌曲详细信息包括歌词3.总结前言首先说明,本教程仅供个人学习,研究使用,禁止用于任何的商业和非法用途。(手动狗头)之所以要研究这个,是因为我想......
  • 【转载】vs设置qt应用程序logo
    1、下载一个ico,拷贝到主函数工程目录下 2、新建一个文件如logo.rc,内容如下:IDI_ICON1ICONDISCARDABLE“logo.ico”3、修改主函数工程文件Main.vcxproj在文件最后添加<ItemGroup><ResourceCompileInclude="logo.rc"/></ItemGroup> 4、生成工程后即可看到ex......
  • MQTT入门DEMO(Java语言)
    目录快速开始准备下载及安装第一次安装EMQX第一次运行EMQX客户端代码快速开始准备MQTT简介EMQX简介下载及安装第一次安装EMQX版本选择EMQX支持多种操作系统,请选择合适您的版本下载。下载地址:https://www.emqx.io/cn/downloads#broker在MicrosoftWindows下安装目前EMQX......
  • 正则表达式匹配最后一部分
    今天,同事问了我一个正则,最后解决了,给大家提供一下参考。用于取网址的最后一部分。本文用于讲解(?=和?<=和?>=和?!的用法)数据如下:https://download.microsoft.com/download/5/3/8/5388ECC4-C2E2-4D40-8C21-D1EA26FEA0CA/msodll40ui2016-kb4018324-fullfile-x86-glb.exehttps://......
  • QTLtools 协变量文件说明(covariate)
    协变量格式如下所示:注意事项:缺失值用NA表示;接受定性和定量的协变量;定量协变量用数值型表示;定性协变量用非数值型表示,类似于上图的A,B,C。定量和定性的判断依据是有没有等级关系,比如年龄属于定量,比如地区属于定性。需要注意的是,只要是定性的变量,都不能用数值表示,不然会被当成......
  • MQTT实现(Java语言)
    下面是我们Java语言实现的MQTT服务的发布/订阅1、添加Maven依赖<dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><version>1.1.1</version></dependency......
  • 关于PHP正则表达式这回事
    ......
  • QT输出彩色log
    要输出彩色信息有点类似于html的语法,即在要输出的文字前加上一段颜色指令。指令格式如下\033[*m这里的*就是转义字符,例如我们要输出一段绿色的文字,则qDebug()<<"\033[32m"<<"Hello!";即在输出文字前,先输出一个颜色指令。注意这个指令对后续的输出都会生效,如果想关掉颜色......
  • Qt Creator按顺序编译多个子项目
    0.环境Qt5.3.2mingw482_321.创建子项目这个子项目类似于VisualStudio中解决方案一样的存在,用于管理多个其他子项目。点击文件->新建文件或项目->其他项目->子项目项目->Choose:之后下一步,选择需要的编译器,我这里只有mingw,若有msvc编译器也可选择msvc,不同的编译器生成的静......
  • Qt+QtWebApp开发笔记(三):http服务器动态html连接跳转基础交互
    前言  网页很多时候是动态的,于是本篇文章目标实现一个简答的动态页面—页静态页面互相跳转,点击可以跳转到子页面。 Demo  下载地址  链接:https://pan.baidu.com/s/1bbhcu1XTiaJRYGRQRG5a0g?pwd=1234 HTML基本页面交换  上一篇的“HelloWorld”......