C++ Qt中不匹配的数字正则表达式
我正在为qqt计算器开发一个数字解析器。我创建了一些正则表达式,以匹配不同类型的数字: 理由:C++ Qt中不匹配的数字正则表达式,c++,regex,qt,C++,Regex,Qt,我正在为qqt计算器开发一个数字解析器。我创建了一些正则表达式,以匹配不同类型的数字: 理由:^[+-]?\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: 主要条款c: 我试着用几个QString来
^[+-]?\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:
主要条款c: 我试着用几个QString来运行这段代码,它们都是数字,但通常都失败了。特别是:如果只有一个字符,如test=“4”,则它不会与数字匹配 你知道为什么那些布尔函数会失败吗?也许我使用了错误的Qt函数,但是在尝试了几个之后,这个函数看起来就像我正在搜索的一样 请随意提出建设性的批评 多谢各位
你的表情很好,但是用
\\d
替换\d
。在我的程序中测试了你的代码。
我真的建议您使用哪个可以在线调试您的表达式
详情来自:
<强>注>:C++编译器在字符串中转换反斜杠。包括 \在regexp中,输入两次,即\。匹配反斜杠 字符本身,输入四次,即\\
整数测试似乎接受小数点。您需要避开反斜杠虽然这可能不会导致您的问题,但是
exactMatch()
已经用字符串开头和字符串结尾锚来封装正则表达式,因此无需放置它们。事实上,整数测试必须接受像“3.0”这样的数字,它们将被转换为3。逃过反斜杠?我将调查此事。我该怎么做?双反斜杠?C++
中的反斜杠'\'
是一个转义字符,因此要将反斜杠放入字符串中,它需要对自身进行转义'\\'
:),并且需要双反斜杠的字符集还有其他缩写,如\\s
\\w\\b
。。。深入查看Qt文档。
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;
}