我正在为q Qt计算器开发一个数字解析器。我创建了一些正则表达式以匹配不同类型的数字:
配给 : ^[+-]?d+/[+-]?d+$
整数 : ^[+-]?d+.?0*$
真实 : ^[+-]?d*.0*[1-9][0-9]*$
复合体 : ^[+-]?[0-9]*(.[0-9]*|/[+-]?[0-9]+)?$[+-]?[0-9]*(.[0-9]*|/[+-]?[0-9]+)?$
我尝试在QString上使用以下功能使用它们:
解析器.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;
}
<小时 />主.c :
QString test ="6/90";
if(isReal(test))
printf("realn");
if(isInteger(test))
printf("Integern");
if(isRationnal(test))
printf("Rationnaln");
if(isNumber(test))
printf("Numbern");
else printf("et merden");
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 validen");
if(IntExp.isValid())
printf("int validen");
if(RealExp.isValid())
printf("real validen");
if(CplxExp.isValid())
printf("cplx validen");
return 0;
}
我尝试使用几个 QString 运行此代码,这些 QString 是数字,但它通常会失败。特别是:如果只有一个像test="4"这样的caracter,它不会用数字进行数学运算。
你知道为什么这些布尔函数失败吗?也许我使用了错误的Qt函数,但是在尝试了几个之后,这个看起来像我正在寻找的。
随意提出建设性的批评,
谢谢
泰奥菲尔
你的表达式很好,但d
替换为\d
。在我的程序中测试了您的代码。我真的推荐这个网站,它可以在线调试你的表达式。
Qt官方文档的详细信息:
注意:C++编译器转换字符串中的反斜杠。要包括 \ 在正则表达式中,输入两次,即 \。匹配反斜杠 字符本身,输入四次,即\\。