正则表达式用于字符串处理是很方便的,但是其规则往往容易学习基础,又很容易忘记,遂将遇到的问题和收集到的资料总结如下。如果对你有帮助,记得点赞、收藏、关注三连哦!
1.正则表达式的基础规则
表达式 | 说明 |
---|---|
^ | 指字符串的开头 |
$ | 指字符串的结尾 |
. | 匹配除了换行符意外的其他字符 |
? | 表示匹配0次或一次 |
+ | 表示匹配至少一次 |
* | 表示匹配0次或任意次 |
| | 或关系,表示左右两个表达式匹配任意一个都可以。如正则式为tom | jerry,匹配的字符串为tom and jerry,将会匹配到两个字符串,即tom和jerry。 |
\\ | 指\本身,而非转义符。因为\在程序里转义的含义,所以如果要匹配\则必须使用\\。需要注意的一点是,外界的string输入的\在程序里其实是以\\的形式表现得,所以和正常转义一样;但是在QT编程时,单个\指转义,所以要实现匹配数字的功能,也就是匹配\d,则正则表达式形式要先将\转义,所以其表达形式为\\d。 |
\s | 匹配任意空白字符 |
\S | 匹配任意非空白字符 |
\d | 任意数字 |
\D | 匹配任意非数字 |
\w | 任意单字字符(字母、数字或下划线) |
\W | 匹配任意非单字字符 |
\b | 用以匹配单词边界,即一部分是\w范围,而另一部分是非、w范围,如@@@bbb,匹配结果为@b |
[] | 用以包含一系列字符 |
[abc] | 表示abc三个单独的字符 |
[a-z] | 表示从a到z26个小写字母 |
[A-Z] | 表示从A到Z26个大写字母 |
[0-9] | 表示从0到9的数字 |
[A-Za-z0-9] | 表示所有大写小写字母和数字的集合 |
[^] | 用以包含除中括号之内字符的其他字符 |
[^abc] | 表示除abc之外的其他字符 |
{} | 修饰匹配字符长度的符号,需要匹配本身需要使用转义 |
{2} | 指匹配2个字符 |
{2,} | 指匹配至少两个字符 |
{2,6} | 指匹配2~6个字符 |
() | 表示一个子表达式,括号内内容作为一个子匹配。 |
(d+)abc | 即匹配至少一个d和abc |
\xXX | 编号在0~255范围的字符 |
\uXXXX | 任何字符都可以使用\u再加上其编号的4位十六进制数表示 |
2.贪婪模式(尽可能匹配)和非贪婪模式(最小匹配)
正则表达式的匹配默认是贪婪的,也就是尽可能的匹配,而这个匹配的次数可以使用上述介绍的{}、?、*、+进行限制。如果待检测文本为xyyyxyyyx,匹配结果举例如下:
正则式 | 匹配结果 |
(x)(\w+) | xyyyxyyyx |
(x)(\w+)(x) | xyyyxyyyx,也就是\w+匹配了yyyxyyy,其实其可以匹配到yyyxyyyx,只是为了让表达式成功匹配,其让出了最后的x。 |
可以通过一些次数限制来改变这一结果,如使用?来进行尽可能少的匹配,即为非贪婪模式。与贪婪模式相似,如果匹配不成功,非贪婪模式会最小限度的再匹配一下。举例如下:
正则式 | 匹配结果 |
(x)(\w+?) | xy |
(x)(\w+?)(x) | xyyyx,为了让整个表达式成功,所以\x+?匹配了yyy |
3.反向引用(\1,\2)
()内的表达式在匹配时,匹配结果会被正则表达式的匹配算法记录下来,是可以单独再使用的,如正则式为(\w)\1{4,},当待检测字符串为aa bbbb abcdefg ccccc 111121111 999999999时,匹配结果第一个为ccccc,第二个结果为999999999。
4.常用表达式
匹配目标 | 正则式 |
匹配非负整数(正整数+0) | ^\d+$ |
匹配正整数 | ^[0-9]*[1-9][0-9]*$ |
匹配非正整数(负整数+0) | ^((-\d+)|(0+))$ |
匹配负整数 | ^-[0-9]*[1-9][0-9]*$ |
匹配整数 | ^-?\d+$ |
匹配非负浮点数(正浮点数 + 0) | ^\d+(\.\d+)?$ |
匹配正浮点数 | ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ |
匹配非正浮点数(负浮点数 + 0) | ^((-\d+(\.\d+)?)|(0+(\.0+)?))$ |
匹配负浮点数 | ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ |
匹配浮点数 | ^(-?\d+)(\.\d+)?$ |
匹配由26个英文字母组成的字符串 | ^[A-Za-z]+$ |
匹配由26个英文字母的大写组成的字符串 | ^[A-Z]+$ |
匹配由26个英文字母的小写组成的字符串 | ^[a-z]+$ |
匹配由数字和26个英文字母组成的字符串 | ^[A-Za-z0-9]+$ |
匹配由数字、26个英文字母或者下划线组成的字符串 | ^\w+$ |
匹配email地址 | ^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$ |
匹配url | ^[a-zA-z]+:(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$ |
匹配html tag | <\s*(\S+)(\s[^>]*)?>(.*?)<\s*\\\1\s*> |
数字,英文大小写字母,下划线,汉字 | ^[a-zA-Z0-9_\u4e00-\u9fa5\\w]+$ |
5.QT正则表达式的使用方法
//需要的头文件
#include <QRegularExpression>
//正则类
QRegularExpression exp;
exp.setPattern(”\\d{2}“);
QString aaa = “abcd”;
QRegularExpressionMatch match = codeFormat.exp.match(aaa);
if(match.hasMatch()==true){
QByteArray ccc;
int lastIndex = match.lastCapturedIndex();
if(lastIndex == 0){
QString bbb = match.captured(0);
ccc.append(bbb.toLatin1());
}else if(lastIndex >0){
for(int expI = 1 ; expI <= lastIndex;++expI)
{
QString bbb = match.captured(expI);
qDebug()<<bbb;
ccc.append(bbb.toLatin1());
}
}
}
6.关于汉子的过滤(UTF-8汉字的正则表达式)
//一般情况下使用(unicode通用)
\u4e00-\u9fa5
//qt下使用如下指令
\x{4e00}-\x{9fa5}
参考链接: