正则表达式详解
\\d{3}:\\d表示转义字符,因为C++用\\表示实际的\,即\\d表示整数,后面的{3}表示目的字符串有连续的三个整数,比如123。
[a-z]+:表示匹配中括号里面小写字母a-z的任意一个字母,后面的+号表示要查找的字符串至少出现一个小写字母。
[A-Z]+:表示匹配中括号里面大写字母A-Z的任意一个字母,后面的+号表示要查找的字符串至少出现一个大写字母。
():([a-z]+[A-Z]+)中的括号()表示是一个整体,则正表达式将该整体标为序号1。
所以\\d{3}([a-z]+[A-Z]+)表示查找目的字符串中起始为连续的三个整数后面跟着一串任意大小写字母,比如123aHkjHU。
-? : 表示一个或者零个负号。?表示重复前面的字符0次或者1次
\d+:\d表示匹配一位数字,是转义的字符,+表示前面的\d(数字)重复一次或者多次
^ :表示限定字符串的开头
$ :限定字符串的结尾
\. :表示匹配小数点
\ :用来标记转义字符
| : 表示或
#include <QRegularExpression>
#include <QRegularExpressionMatch>
void Widget::on_pushButton_clicked()
{
//匹配字符串中连续两位数字后面跟着一串字母,遇到空格截止
QRegularExpression re("\\d{3}([a-z]+|[A-Z]+)");
QRegularExpressionMatch match=re.match("abc123 def abc123def abc123 def");
if(match.hasMatch())
{
QString matched = match.captured(0);
qDebug()<<matched;
}
}
运行结果:123def
1,相关符号
在正则表达式中,*、?、+、{n} 等符号被称为量词,用于指定匹配模式中前面字符的重复次数或出现情况。下面详细介绍一些常用的量词及其作用:
*(星号):表示匹配前面的字符零次或多次。
- 示例:ab* 可以匹配 "a", "ab", "abb", "abbb" 等。
+(加号):表示匹配前面的字符至少一次或多次。
- 示例:ab+ 可以匹配 "ab", "abb", "abbb" 等,但不能匹配 "a"。
?(问号):表示匹配前面的字符零次或一次,即可选匹配。
- 示例:ab? 可以匹配 "a", "ab",但不能匹配 "abb"。
{n}:表示匹配前面的字符恰好 n 次。
- 示例:a{3} 可以匹配 "aaa",但不能匹配 "aa" 或 "aaaa"。
{n,}:表示匹配前面的字符至少 n 次。
- 示例:a{2,} 可以匹配 "aa", "aaa", "aaaa" 等。
{n,m}:表示匹配前面的字符至少 n 次,最多 m 次。
- 示例:a{2,4} 可以匹配 "aa", "aaa", "aaaa",但不能匹配 "a" 或 "aaaaa"。
2,匹配示例
当使用正则表达式时,可以根据具体的需求和匹配规则来编写不同的正则表达式模式。以下是一些常见的正则表达式写法示例:
匹配数字:\d+
- 示例:匹配一个或多个数字,例如:"123", "4567"等。
匹配字母:[a-zA-Z]+
- 示例:匹配一个或多个字母,不区分大小写,例如:"abc", "XYZ"等。
匹配邮箱地址:\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Z|a-z]{2,}\b
- 示例:匹配常见的邮箱地址格式,例如:"example@example.com", "test123@test.com"等。
匹配URL:(http|https)://([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?
- 示例:匹配常见的URL格式,例如:"http://www.example.com", "https://www.test.com/page1"等。
匹配手机号码:1\d{10}
- 示例:匹配中国大陆手机号码格式,以1开头,共11位数字,例如:"13912345678", "18888888888"等。
3,正常的匹配
要进行匹配,只需调用match()函数,传入一个要匹配的字符串。我们把这个字符串称为主题字符串。match()函数的结果是一个QRegularExpressionMatch对象,可用于检查匹配的结果
// match two digits followed by a space and a word
QRegularExpression re("\\d\\d \\w+");
QRegularExpressionMatch match = re.match("abc123 def");
bool hasMatch = match.hasMatch(); // true
如果匹配成功,(隐式的)捕获组编号0可以用来检索整个模式匹配的子字符串(参见提取捕获子字符串部分)
QRegularExpression re("\\d\\d \\w+");
QRegularExpressionMatch match = re.match("abc123 def");
if (match.hasMatch())
{
QString matched = match.captured(0); // matched == "23 def"
}
也可以将偏移量作为参数传递给match()函数,让匹配从主题字符串中的任意偏移量开始。在下例中,不匹配“12abc”,因为匹配从偏移量1开始:
QRegularExpression re("\\d\\d \\w+");
QRegularExpressionMatch match = re.match("12 abc 45 def", 1);
if (match.hasMatch())
{
QString matched = match.captured(0); // matched == "45 def"
}
4,提取捕获的子字符串
QRegularExpressionMatch对象还包含模式字符串中捕获组捕获的子字符串的信息。captured()函数将返回第n个捕获组捕获的字符串:
QRegularExpression re("^(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)$");
QRegularExpressionMatch match = re.match("08/12/1985");
if (match.hasMatch())
{
QString day = match.captured(1); // day == "08"
QString month = match.captured(2); // month == "12"
QString year = match.captured(3); // year == "1985"
// ...
}
模式中的捕获组从1开始编号,隐式捕获组0用于捕获与整个模式匹配的子串。
也可以使用capturedStart()和capturedEnd()函数来取得每个捕获的子字符串的起始和结束偏移量(在主题字符串中):
QRegularExpression re("abc(\\d+)def")
QRegularExpressionMatch match = re.match("XYZabc123defXYZ");
if (match.hasMatch())
{
int startOffset = match.capturedStart(1); // startOffset == 6
int endOffset = match.capturedEnd(1); // endOffset == 9
}
所有这些函数都有一个重载,以QString作为参数,以便提取命名的捕获子字符串。
QRegularExpression re("^(?<date>\\d\\d)/(?<month>\\d\\d)/(?<year>\\d\\d\\d\\d)$");
QRegularExpressionMatch match = re.match("08/12/1985");
if (match.hasMatch())
{
QString date = match.captured("date"); // date == "08"
QString month = match.captured("month"); // month == "12"
QString year = match.captured("year"); // year == 1985
}