我正在研究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上使用以下功能:
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;
}
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功能,但在尝试了几次后,这个看起来就像我在寻找的那样。
随意提出建设性的批评,
非常感谢,
泰奥菲尔
答案 0 :(得分:3)
您的表达式很好,但将\d
替换为\\d
。在我的程序中测试了代码。
我真的建议this site可以在线调试你的表达。
来自Qt Official Documentation 的详细信息:
注意:C ++编译器转换字符串中的反斜杠。包括一个 \在正则表达式中,输入两次,即\。匹配反斜杠 字符本身,输入四次,即\\。