QRegularExpression 是Qt 5.0才引进的,相对于QRegExp,QRegularExpression class修复了很多bug,提高了效率,提供了对Perl的RegEx几乎全面兼容的搜索引擎。简单说,QRegExp年久失修,bug较多,使用时建议使用QRegularExpression。
先上代码,后面逐函数简介:
QRegularExpression regularExpression(pattern);
int index = 0;
QRegularExpressionMatch match;
do {
match = regularExpression.match(testStr, index);
if(match.hasMatch()) {
index = match.capturedEnd();
qDebug()<<"("<
QString QRegExp::cap(int nth = 0) const;
QString QRegularExpressionMatch::captured(int nth = 0) const;
推测:这样以来,QRegularExpression 检索的负担减小,效率因此提高;
1.match() 匹配:
QRegularExpressionMatch match(const QString &subject,
int offset = 0,
MatchType matchType = NormalMatch,
MatchOptions matchOptions = NoMatchOption) const;
subject 被匹配的目标字符串;
offset 偏移,匹配起始位置;
MatchType 匹配类型;
MatchOption匹配选项;
返回值 匹配的结果对象;
2. 匹配主要结果:
QString captured(int nth = 0) const;
int capturedStart(int nth = 0) const;
int capturedLength(int nth = 0) const;
int capturedEnd(int nth = 0) const;
分别为匹配到的字符串,匹配字符串的起点,长度,终点;
注意:都带参数,意味着可以获取每个匹配段(即为正则表达式中的每个括号)的字符串及其长度和起终点。
captured() 函数与 QRegExp::cap() 基本一致,不过相比增加了三个函数,返回每个匹配段的位置;
例如正则pattern为 "(\\w+)(\\d+)"
match.captured() 获取正则匹配结果,缺省参数为0;
match.captured(1) 获取(\\w+) 对应匹配结果,返回的是字母;
match.capturedStart(1) 获取这段字母在整个字符串的起始位置;
match.captured(2) 获取(\\d+) 对应匹配结果,返回的是数字;
match.capturedEnd(2) 获取这段字母在整个字符串的结束位置;
3. captureEnd()
int QRegularExpressionMatch::capturedEnd(int nth = 0) const;
QRegExp匹配遍历,只能获得匹配的字符串长度和匹配位置。下个循环的匹配起点需要手动处理(相加):
int pos = 0;
while ((pos = rx.indexIn(trl , pos)) != -1)
{
pos += rx.matchedLength();
qDebug() << rx.cap();
}
现在QRegularExpression可以用match.captureEnd()返回值直接作为下次遍历的起始检索位置;
4.capturedTexts()
QStringList capturedTexts() const;
返回各个匹配段的QStringList,其按照在Patern中的顺序。
即captured(1),captured(2),captured(3),,,等所有匹配段结果的QStringList。
5.lastCapturedIndex()
最后一个匹配段的索引,亦即所有匹配段的数量;
QRegularExpressionMatch match = re.match(string);
for (int i = 0; i <= match.lastCapturedIndex(); ++i) {
QString captured = match.captured(i);
// ...
}