Qt中不匹配的数字Regex

时间:2016-05-22 11:07:58

标签: c++ regex qt

我正在研究q Qt计算器的数字解析器。我创建了一些正则表达式以匹配不同类型的数字:

Rationnal:^[+-]?\d+\/[+-]?\d+$

整数:^[+-]?\d+\.?0*$

真实:^[+-]?\d*\.0*[1-9][0-9]*$

复合体:^[+-]?[0-9]*(\.[0-9]*|\/[+-]?[0-9]+)?\$[+-]?[0-9]*(\.[0-9]*|\/[+-]?[0-9]+)?$

我尝试在QString上使用以下功能:

parser.h:

     bool isRationnal(const QString s)
{
    QRegExp ratioExp ("^[+-]?\d+\/[+-]?\d+$");
    return ratioExp.exactMatch(s);
}
bool isInteger(const QString s)
{
    QRegExp regExp ("^[+-]?\d+\.?0*$");
    return regExp.exactMatch(s);
}
bool isReal(const QString s)
{
    QRegExp regExp ("^[+-]?\d*\.0*[1-9][0-9]*$");
    return regExp.exactMatch(s);
}
bool isComplex(const QString s)
{
    QRegExp regExp ("^[+-]?[0-9]*(\.[0-9]*|\/[+-]?[0-9]+)?\$[+-]?[0-9]*(\.[0-9]*|\/[+-]?[0-9]+)?$");
    return regExp.exactMatch(s);
}
bool isNumber(const QString s){
   bool ok=false;
   s.toInt(&ok);
   return ok;
}

main.c:

QString test ="6/90";
    if(isReal(test))
        printf("real\n");

    if(isInteger(test))
        printf("Integer\n");

    if(isRationnal(test))
        printf("Rationnal\n");

    if(isNumber(test))
        printf("Number\n");
    else printf("et merde\n");
    QRegExp ratioExp ("^[+-]?\d+\/[+-]?\d+$");
    QRegExp IntExp ("^[+-]?\d+\.?0*$");
    QRegExp RealExp ("^[+-]?\d*\.0*[1-9][0-9]*$");
    QRegExp CplxExp ("^[+-]?[0-9]*(\.[0-9]*|\/[+-]?[0-9]+)?\$[+-]?[0-9]*(\.[0-9]*|\/[+-]?[0-9]+)?$");
    if(ratioExp.isValid())
        printf("ratio valide\n");

    if(IntExp.isValid())
        printf("int valide\n");
    if(RealExp.isValid())
        printf("real valide\n");
    if(CplxExp.isValid())
        printf("cplx valide\n");

    return 0;
}

我尝试使用多个QString运行此代码,这些代码是数字,但通常会失败。特别是:如果只有一个像test =“4”这样的特征,它就不会带数字。

你知道为什么那些布尔函数失败了吗?也许我使用了错误的Qt功能,但在尝试了几次后,这个看起来就像我在寻找的那样。

随意提出建设性的批评,

非常感谢,

泰奥菲尔

1 个答案:

答案 0 :(得分:3)

您的表达式很好,但将\d替换为\\d。在我的程序中测试了代码。 我真的建议this site可以在线调试你的表达。

来自Qt Official Documentation 的详细信息:

  

注意:C ++编译器转换字符串中的反斜杠。包括一个   \在正则表达式中,输入两次,即\。匹配反斜杠   字符本身,输入四次,即\\。