如何用QRegularExpression替代QRegExp实现仅空白字符匹配?
用QRegularExpression实现仅空白字符的校验(替代QRegExp的exactMatch功能)
你遇到的问题核心在于:QRegExp的exactMatch()方法要求整个字符串完全匹配正则表达式,而QRegularExpression的match()方法默认是查找字符串中任意位置存在匹配的子串。
你的原正则\s*匹配0个或多个空白字符,所以任何字符串里都能找到符合条件的子串(比如空匹配),导致match()一直返回true。要实现和exactMatch()相同的效果,有两种方案:
方案1:使用FullMatch匹配选项
调用match()时传入QRegularExpression::FullMatch参数,强制要求整个字符串完全匹配正则,和QRegExp的exactMatch()行为完全一致:
#include <QCoreApplication> #include <QDebug> #include <QRegExp> #include <QRegularExpression> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString inputString1 = "thisisatest"; QString inputString2 = "this is a test"; QString inputString3 = " \n\t"; // 使用FullMatch选项实现全匹配校验 QRegularExpression whiteSpace(QStringLiteral("\\s*")); qDebug() << whiteSpace.match(inputString1, 0, QRegularExpression::FullMatch).hasMatch(); // 返回false qDebug() << whiteSpace.match(inputString2, 0, QRegularExpression::FullMatch).hasMatch(); // 返回false qDebug() << whiteSpace.match(inputString3, 0, QRegularExpression::FullMatch).hasMatch(); // 返回true // 原有QRegExp行为 QRegExp whiteSpace1(QStringLiteral("\\s*")); qDebug() << whiteSpace1.exactMatch(inputString1); // 返回false qDebug() << whiteSpace1.exactMatch(inputString2); // 返回false qDebug() << whiteSpace1.exactMatch(inputString3); // 返回true return 0; }
方案2:修改正则表达式(锚定首尾)
给正则表达式添加字符串首尾锚点^和$,表示匹配必须从字符串开头开始,到结尾结束,这样无需额外选项也能实现全匹配:
// 替换正则为^\\s*$(锚定首尾) QRegularExpression whiteSpaceAlt(QStringLiteral("^\\s*$")); qDebug() << whiteSpaceAlt.match(inputString1).hasMatch(); // 返回false qDebug() << whiteSpaceAlt.match(inputString2).hasMatch(); // 返回false qDebug() << whiteSpaceAlt.match(inputString3).hasMatch(); // 返回true
两种方案都能达到你想要的效果,方案1更贴近原QRegExp的使用逻辑,方案2则通过正则本身的语义实现全匹配。
内容的提问来源于stack exchange,提问作者Thalia
相关产品推荐
相关产品推荐

