所以我应该接受用户输入并评估用户输入是否是有效的中缀表达式。我只接受+ - / * ( )
和数字。
所以最简单的方法是使用正则表达式。
这是我的正则表达式:[\(\)\d\+\-\/\*]+
。
我也尝试过:[\(\)0-9\+\-\/\*]+
以及。[\(\)[:digit:]\+\-\/\*]+
=
我也试过没有转义字符,但我仍然得到相同的结果。
问题在于,当我将cout<<"Enter the infix expression: ";
cin>>userInput;
regex infix ("[\(\)\d\+\-\/\*]+");
while(cin.fail()||regex_match(userInput,infix)){
cin.clear();
cin.ignore(256, '\n');
cout<<"Error: Not a valid infix expression!\n";
cout<<"Enter the infix expression: ";
cin>>userInput;
}
cout<<"Valid expression!\n";
作为表达式时,它会通过。
以下代码:
Enter the infix expression: =
Valid expression!
当前输出:
Enter the infix expression: =
Error: Not a valid infix expression!
预期产出:
auto.offset.reset = earliest
如果您需要更多代码,请与我们联系。
答案 0 :(得分:1)
固定的正则表达式声明看起来像
regex infix(R"([()\d+/*-]+)");
或者,如果你不能使用原始字符串文字:
regex infix("[()\\d+/*-]+");
请参阅C++ demo。
请注意+
和/
之间的连字符,无论是否转义,都会在这两个符号之间创建范围。此外,\d
必须在常规字符串文字中看起来像\\d
,在原始字符串文字中看起来像\d
。
/
符号不必转义。
此外,必须调整逻辑以返回适当的错误消息/行为:
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main() {
string userInput = "=";
regex infix(R"([()\d+/*-]+)");
if(regex_match(userInput,infix)){
cout<<"Valid expression!\n";
} else {
cout<<"Error: Not a valid infix expression!\n";
}
return 0;
}
// => Error: Not a valid infix expression!