Qt中正则表达式

       @[TOC](不积跬步 无以至千里)

Qt中正则表达式

正则表达式(regular expression),就是在一个文本中匹配子字符串的一种模式(pattern),它可以简写为“regexp”,。一个regexp主要应用在以下几个方面:

验证:一个regexp可以测试一个子字符串是否符合一些标准。例如,是一个整数或者不包含任何空格等。

**搜索:**一个regexp提供了比简单的子字符串匹配更强大的模式匹配。例如,匹配单词mail或者letter,而不匹配单词email或者letterbox。

**查找和替换:**一个regexp可以使用一个不同的字符串替换一个字符串中所有要替换的子字符串。例如,使用Mail来替换一个字符串中所有的M字符,但是如果M字符后面有ail时不进行替换。

**字符串分割:**一个regexp可以识别在哪里进行字符串分割。例如,分割制表符隔离的字符串。

 Qt中的QRegExp类实现了使用正则表达式进行模式匹配。QRegExp是以Perl的正则表达式语言为蓝本的,它完全支持Unicode。QRegExp中的语法规则可以使用setPatternSyntax()函数来更改

Qt正则表达式

正则表达式(regular expresion ):由表达式(expressions)、量词(quantifiers)和断言(assertions)。一个最简单的正则表达式就仅有表达式。例如匹配一个字符a,[a]。

表达式:
表达匹配的字符,例如匹配一个字符[a];字符串"hello".
一组字符可以使用方括号括起来,例如[ABC]将会匹配一个A或者一个B或者一个C,这个也可以简写为[A-C],这样我们要匹配所有的英文大写字母,就可以使用[A-Z]。

量词:
指定了必须要匹配的表达式出现的次数。
{m,n}: 至少m次,至多n次
{0,1}:至多匹配一次
{1,}:至少1次,
断言:
断言在regexp中作出一些有关文本的声明,它们不匹配任何字符。
例如:要求在字符串”123“获取数字,要求从头匹配,匹配到字符串的结尾,(即匹配整个字符串),那么表达式:^ [0-9] {1,3} 。 断 言 “ ” 和 “ 。 断言“^”和“ ”,当 ^ 在regexp中作为第一个字符时,意味着这个regexp必须从字符串的开始进行匹配;当 $ 在regexp中作为最后一个字符时,意味着regexp必须匹配到字符串的结尾。

表达式组合:
将regexp用括号括起来,即 (regexp1|regexp2) 。括号将表达式组合在一起,可以在一个更复杂的regexp中作为一个组件来使用
用一个regexp来匹配单词“mail”或者“letter”其中的一个,但是不要匹配那些包含这些单词的单词,比如“email”和“letterbox”。
要匹配“mail”,regexp可以写成m{1,1}a{1,1}i{1,1}l{1,1} ,因为 {1,1} 可以省略,所以又可以简写成mail 。
下面就可以使用竖线“|”来包含另外一个单词,这里“|”表示“或”的意思。为了避免regexp匹配多余的单词,必须让它从单词的边界进行匹配。
首先将regexp用括号括起来,即 (mail|letter) 。为了强制匹配的开始和结束都在单词的边界上,要将regexp包含在 \b 单词边界断言中,即 \b(mail|letter)\b 。这个 \b 断言在regexp中匹配一个位置,而不是一个字符,一个单词的边界是任何的非单词字符,如一个空格,新行,或者一个字符串的开始或者结束。

替代符号
一般可以使用一些特殊的符号来表示一些常见的字符组和量词.
在这里插入图片描述

量词用法
默认的,一个表达式将自动量化为{1,1},就是说它应该出现一次。在下表中列出了量词的使用情况,其中E代表一个表达式,一个表达式可以是一个字符,或者一个字符集的缩写,或者在方括号中的一个字符集,或者在括号中的一个表达式。
在这里插入图片描述
断言用法
正则表达式中的断言如下表所示,其中E代表一个表达式。
在这里插入图片描述
通配符
QRegExp类还支持通配符(Wildcard)匹配。QRegExp的setPatternSyntax()函数就是用来在regexp和通配符之间进行切换的。通配符匹配要比regexp简单很多,它只有四个特点,如下表所示。
在这里插入图片描述

正则表达示例

正则表达是搜索
匹配字符a
QRegExp ex(“a”);
QString str(“a”);
QString str1(“c”);
qDebug() << ex.indexIn(str);
qDebug() << ex.indexIn(str1);
输出:
在这里插入图片描述

匹配特殊字符 ’
'\'做为转意,即通常在"“后面的字符不按原来意义解释,如/b/匹配字符"b”,当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。
或者:
对正则表达式功能字符的还原,如"
“匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了”“后,/a*/将只匹配"a*”。
ex.setPattern(("*"));
str = “awd*”;
qDebug() << ex.indexIn(str);
ex.setPattern(("\\*")); //第一个’\’对第二个‘\’还原。表示匹配‘*’字符
qDebug() << ex.indexIn(str);
输出:
在这里插入图片描述
匹配字符串
str = “my name is kk”;
ex.setPattern((“nam”));
qDebug() << ex.indexIn(str);
ex.setPattern("\bname\b"); //匹配单词边界
qDebug() << ex.indexIn(str);
输出:
在这里插入图片描述

ex.setPattern("^my");
qDebug() << ex.indexIn(str);
ex.setPattern("^name"); //从开头匹配
qDebug() << ex.indexIn(str);
输出:
在这里插入图片描述

ex.setPattern("^my(?= )"); ///要求 my后跟空格
qDebug() << ex.indexIn(str);
ex.setPattern("^my(?=name)");
qDebug() << ex.indexIn(str);
输出:
在这里插入图片描述

正则表达查找和替换
查找引用
QRegExp rx4("(\b\w+(?!😃\b)");
QString str4 = “name: tom tony marry”;
QStringList list;
int pos2 = 0;
while ((pos2 = rx4.indexIn(str4, pos2)) != -1)
{
list << rx4.cap(1); // 第一个捕获到的文本
pos2 += rx4.matchedLength(); // 上一个匹配的字符串的长度
}
qDebug() << list;
输出:
在这里插入图片描述
反向引用
可以在regexp中使用捕获到的文本,为了表示捕获到的文本,使用反向引用 \n ,其中n从1开始编号,比如 \1 就表示前面第一个捕获到的文本。例如,使用\b(\w+)\W+\1\b 在一个字符串中查询重复出现的单词,这意味着先匹配一个单词边界,随后是一个或者多个单词字符,随后是一个或者多个非单词字符,随后是与前面第一个括号中相同的文本,随后是单词边界。
这里涉及一个捕获组概念:参考 正则基础之——捕获组(capture group)
尝试了,貌似不可以。

替换
QRegExp re ("(?:world)"); //匹配非world部分 ?:表示非捕获
QString str3 = “hello world”;
str3.replace(re,“tom”);
qDebug()<< str3;
输出:
在这里插入图片描述
正则表达字符验证
QString pattern(“.=.”);
QRegExp rx(pattern);
bool match = rx.exactMatch(“a=3″);
qDebug() << match; // True
match = rx.exactMatch(“a/2″);
qDebug() << match; // False

正则表达字符串分割
QString strFrame = “hello world, tom sss”;
strFrame = strFrame.simplified(); // simplified是很好用的函数,可以去掉开头结尾的空格和回车,中间的多余空格也不放过。
QStringList sections = strFrame.split(QRegExp( “[ ,]+”)); //将非字符去掉,把字符串写进QStringList中
qDebug() << sections ;
输出:
在这里插入图片描述

  • 9
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值