- QT5中使用正则表达式建议使用QRegularExpression,不再使用QRegExp
- QRegularExpression较之QRegExp进行了优化改进
主要使用的类
- QRegularExpression 创建正则表达式对象
- QRegularExpressionMatch 获取字符串匹配结果
- QRegularExpressionMatchIterator 获取字符串匹配结果迭代器(全局匹配,匹配多个)
主要功能
- 验证
- 字符串查找
- 字符串查找并替换
- 字符串分割
创建对象(构造)
QRegularExpression re("a pattern");
设置正则表达式模式
QRegularExpression re;
re.setPattern("another pattern");
获取正则表达式模式
QRegularExpression re("a third pattern");
QString pattern = re.pattern(); // pattern == "a third pattern"
设置模式选项
// 不区分大小写
QRegularExpression re("Qt rocks", QRegularExpression::CaseInsensitiveOption);
// 多行匹配
QRegularExpression re("^\\d+$");
re.setPatternOptions(QRegularExpression::MultilineOption);
获取模式选项
QRegularExpression re = QRegularExpression("^two.*words$", QRegularExpression::MultilineOption |
QRegularExpression::DotMatchesEverythingOption);
QRegularExpression::PatternOptions options = re.patternOptions();
// options == QRegularExpression::MultilineOption | QRegularExpression::DotMatchesEverythingOption
字符串匹配(匹配结果单个)
模式中的捕获组从 1 开始编号,隐式捕获组编号 0 用于捕获与整个模式匹配的子字符串。
// 检测是否匹配成功
QRegularExpression re("\\d\\d \\w+");
QRegularExpressionMatch match = re.match("abc123 def");
bool hasMatch = match.hasMatch(); // true
// 获取字符串匹配结果
QRegularExpression re("\\d\\d \\w+");
QRegularExpressionMatch match = re.match("abc123 def");
if (match.hasMatch()) {
QString matched = match.captured(0); // matched == "23 def"
}
// 从偏移量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"
}
// 提取字符串 使用captured(int nth = 0)
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"
}
// 提取字符串,使用captured(const QString &name)
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
}
获取子字符串索引
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
}
全局匹配(匹配结果多个)
QRegularExpression re("(\\w+)");
QRegularExpressionMatchIterator i = re.globalMatch("the quick fox")
QStringList words;
while (i.hasNext()) {
QRegularExpressionMatch match = i.next();
QString word = match.captured(1);
words << word;
} // words contains "the", "quick", "fox"
检测正则表达式是否语法错误
QRegularExpression invalidRe("(unmatched|parenthesis");
if (!invalidRe.isValid()) {
QString errorString = invalidRe.errorString(); // errorString == "missing )"
int errorOffset = invalidRe.patternErrorOffset(); // errorOffset == 22
}
部分匹配
适用于
- 用户输入验证
- 增量多段匹配
匹配类型
- QRegularExpression::PartialPreferCompleteMatch
模式字符串与主题字符串部分匹配。如果找到部分匹配,则将其记录下来,并照常尝试其他匹配的替代方案。 如果找到完全匹配,则优先于部分匹配;在这种情况下,只报告完整的匹配。 相反,如果没有找到完全匹配(但只有部分匹配),则报告部分匹配。 - QRegularExpression::PartialPreferFirstMatch
模式字符串与主题字符串部分匹配。如果找到部分匹配,则匹配停止并报告部分匹配。在这种情况下,不会尝试其他匹配的替代方案(可能导致完全匹配)。此外,此匹配类型假定主题字符串只是较大文本的子字符串,并且(在此文本中)主题字符串末尾之外还有其他字符,这可能会导致令人惊讶的结果。
/***************QRegularExpression::PartialPreferCompleteMatch***************/
// 例子1
QString pattern("^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \\d\\d?, \\d\\d\\d\\d$");
QRegularExpression re(pattern);
QString input("Jan 21,");
QRegularExpressionMatch match = re.match(input, 0, QRegularExpression::PartialPreferCompleteMatch);
// 全匹配
bool hasMatch = match.hasMatch(); // false
// 部分匹配
bool hasPartialMatch = match.hasPartialMatch(); // true
QString captured = match.captured(0); // captured == "Jan 21,"
// 例子2
QString pattern("^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \\d\\d?, \\d\\d\\d\\d$");
QRegularExpression re(pattern);
QString input("Dec 8, 1985");
QRegularExpressionMatch match = re.match(input, 0, QRegularExpression::PartialPreferCompleteMatch);
bool hasMatch = match.hasMatch(); // true
bool hasPartialMatch = match.hasPartialMatch(); // false
// 例子3
QRegularExpression re("abc\\w+X|defY");
QRegularExpressionMatch match = re.match("abcdef", 0, QRegularExpression::PartialPreferCompleteMatch);
bool hasMatch = match.hasMatch(); // false
bool hasPartialMatch = match.hasPartialMatch(); // true
QString captured = match.captured(0); // captured == "abcdef"
/***************QRegularExpression::PartialPreferFirstMatch***************/
// 例子1
QRegularExpression re("abc|ab");
QRegularExpressionMatch match = re.match("ab", 0, QRegularExpression::PartialPreferFirstMatch);
bool hasMatch = match.hasMatch(); // false
bool hasPartialMatch = match.hasPartialMatch(); // true
// 例子2
QRegularExpression re("abc(def)?");
QRegularExpressionMatch match = re.match("abc", 0, QRegularExpression::PartialPreferFirstMatch);
bool hasMatch = match.hasMatch(); // false
bool hasPartialMatch = match.hasPartialMatch(); // true
// 例子3
QRegularExpression re("(abc)*");
QRegularExpressionMatch match = re.match("abc", 0, QRegularExpression::PartialPreferFirstMatch);
bool hasMatch = match.hasMatch(); // false
bool hasPartialMatch = match.hasPartialMatch(); // true
正则表达式基本语法
https://blog.csdn.net/lin786063594/article/details/125301089?spm=1001.2014.3001.5501
学习资料
QT帮助文档