问题描述
我想创建一个验证用户输入的程序。我发现了一个正则表达式,可以验证输入是否正确。问题在于该程序允许用户输入不属于正确输入的额外字符。例如,正确的输入为23km,它允许用户输入类似23rt的内容,而这正是我要消除的内容。这是我的代码:
QRegExp r1("\\d{1,}(km|hm|dam|m|dm|сm) \\d{1,2}(km|hm|dam|m|dm|сm) x \\d{1,2}(km|hm|dam|m|dm|сm)");
if(input.isEmpty()) return qvalidator::Intermediate;
if(r1.exactMatch(input)) return qvalidator::Acceptable; else
return qvalidator::Intermediate;
我最后尝试了return qvalidator::Invalid;
,它根本不接受输入。
我想制作以下形式的东西:(23km 3m X 1km 4m)。
解决方法
我认为您在获取传递到此函数的输入字符串时可能会犯错。 std :: cin会自动在空格处中断,请确保您使用的是std :: getline。 以下代码似乎对我有用。
#include <QtCore/QRegularExpression>
#include <QtCore/QString>
#include <string>
#include <QtGui/QValidator>
#include <iostream>
QValidator::State test(QString input)
{
QRegularExpression r1("\\d{1,}(km|hm|dam|m|dm|сm) \\d{1,2}(km|hm|dam|m|dm|сm) x \\d{1,2}(km|hm|dam|m|dm|сm)");
//QRegExp r1(".*\\d{1,2}(km|hm|dam|m|dm|сm).*");
//QRegularExpression r1("test test");
if(input.isEmpty()) return QValidator::Intermediate;
if(r1.match(input).hasMatch()) return QValidator::Acceptable;
else return QValidator::Invalid;
}
int main()
{
std::string input;
for (int i = 0; i < 100; i++)
{
std::getline(std::cin,input);
QString test_str = QString::fromStdString(input);
QValidator::State res = test(test_str);
std::cout<<res<<std::endl;
}
return 0;
}