【QT小记】QT中正则表达式QRegularExpression的基本使用

  • 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帮助文档

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值