转自Qt正则表达式_qt 正则表达式_骆驼胡杨的博客-优快云博客
正则表达式
正则表达式即一个文本匹配字符串的一种模式,Qt中QRegExp类实现使用正则表达式进行模式匹配,且完全支持Unicode,主要应用:字符串验证、搜索、查找替换、分割。
正则表达式中字符及字符集
正则表达式中的量词
正则表达式中的断言
QRegExp同时支持通配符
自己写了代码验证了下
// QRegExp regexp("[A-Za-z][1-9][0-9]{0,2}");
// QRegExp regexp("1*2"); *表示0到多次
// QRegExp regexp("1?2"); ?表示0到1次
// QRegExp regexp("1+2"); +表示1到多次
// QRegExp regexp("\\d+\\D{2}");
// QRegExp regexp("\d+\D{2}");
QRegExp regexp("\\b[1-9]{0,1}\\d{0,1}\\\\\\b");
ui->lineEdit->setValidator(new QRegExpValidator(regexp,this));
发现,在qt使用中,都要使用两个\\才可以,1个的话就是对应的字符,且只有\c\C\d\D\w\W能表示对应的字符(我没有测试所有只测试了部分,感觉就是如果原本转义的是不可见字符则单个\使用的话就不能表示对应的字符例如\a\A都不行),
每次?*+都分不清楚的,可以理解为?表示有或者没有即0到1,+表示正数即1到多,剩下*就表示0到多。
不理解为什么还要有通配符模式,?表示任意一个字符,*表示0到多个字符
-----------
cap()捕获的使用
cap(0)表示完全匹配,会返回整个匹配结果,cap(1) 是第一个捕获括号的文本,cap(2) 是第二个捕获括号的文本
cap(0)cap(1)cap(2) 的区别
使用捕获的格式为:(E)
使用非捕获格式为:(?:E) 非捕获效率比捕获高
QRegExp exp2("(\\d+)(?:\\s*)(cm|inch(es)?)");//理解是匹配整个模式,又细拆分为几个部分,这个就是找数字+任意个空格+cm或者inch或者inches的字符串,且细分为4个部分,但又不抓取空格,后面的inches又分两次抓取inches,es
int p2=exp2.indexIn("Length:198inches");
if(p2>-1)
{
qDebug()<<exp2.cap(0);//输出全部匹配的内容 198inches
qDebug()<<exp2.cap(1);//输出第一个匹配的内容 198
qDebug()<<exp2.cap(2);//输出第二个匹配的内容 inches
qDebug()<<exp2.cap(3);//输出第二个匹配的内容 es
}
-------
//断言 (?!) 表示:不紧跟才能匹配
QRegExp regAssertFalse("面(?!包)"); //匹配面不能接包,只匹配一个面
QString str = "面包没了,只剩面条了";
str.replace(regAssertFalse, "龙虾鲍鱼");
qDebug() << str; //输出: "面包没了,只剩龙虾鲍鱼条了"
//断言 (?=) 表示:紧跟才匹配
QRegExp regAssertTrue("面(?=包)");//匹配面包的面
QString str1 = "面包没了,只剩面条了";
str1.replace(regAssertTrue, "草");
qDebug() << str1; //输出: "草包没了,只剩面条了"
Qt5引进了新的正则表达式
QRegularExpression regExp("hello");//构造函数表达式
qDebug() << regExp.match("hello world");
//输出 QRegularExpressionMatch(Valid, has match: 0:(0, 5, "hello"))
regExp.setPattern("([A-Z]{3,8})");//在对象上设置表达式,不会覆盖原有的设置
regExp.setPatternOptions(QRegularExpression::CaseInsensitiveOption); //大小写不敏感
qDebug() << regExp.match("hello");//这里进行了两次匹配
//输出 QRegularExpressionMatch(Valid, has match: 0:(0, 5, "hello"), 1:(0, 5, "hello"))
//新类捕获匹配
QRegularExpression regExp1("^(\\d\\d\\d\\d)/(\\d\\d)/(\\d\\d)$");
QRegularExpressionMatch match0 = regExp1.match("2022/04/04");
qDebug() << regExp1.match("2022/04/04");
//输出 QRegularExpressionMatch(Valid, has match: 0:(0, 10, "2022/04/04"), 1:(0, 4, "2022"), 2:(5, 7, "04"), 3:(8, 10, "04"))
if(match0.isValid()){
QString strMatch0 = match0.captured(0);
QString year = match0.captured(1);
QString month = match0.captured(2);
QString day = match0.captured(3);
qDebug() << "日期: " << strMatch0;
qDebug() << "年: " << year;
qDebug() << "月: " << month;
qDebug() << "日: " << day;
}
QString sPattern;
sPattern = "^(Jan|Feb|Mar|Apr|May) \\d\\d \\d\\d\\d\\d$";
QRegularExpression regDate(sPattern);
QString ss("Feb 02 2022");
QRegularExpressionMatch dateMatch;
dateMatch = regDate.match(ss, 0,
QRegularExpression::PartialPreferCompleteMatch); //部分匹配
qDebug() << dateMatch;
//输出 QRegularExpressionMatch(Valid, has match: 0:(0, 11, "Feb 02 2022"), 1:(0, 3, "Feb"))
bool b_HasMatched = dateMatch.hasMatch(); //完整匹配的返回值
bool b_Partial = dateMatch.hasPartialMatch(); //部分匹配的返回值
qDebug() << b_HasMatched; //true
qDebug() << b_Partial; //false