Qt RegExp验证器C ++

问题描述

我想创建一个验证用户输入的程序。我发现了一个正则表达式,可以验证输入是否正确。问题在于该程序允许用户输入不属于正确输入的额外字符。例如,正确的输入为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;

}