所以我应该接受用户输入并评估用户输入是否是有效的中缀表达式。我只接受 + -/* ( )
和数字。
所以最简单的方法是使用正则表达式。
这是我的正则表达式:[\(\)\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!
如果您需要更多代码,请告诉我。
最佳答案
固定的正则表达式声明看起来像
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!
关于c++ - 当我认为它不应该在 C++ 中时,正则表达式采用等号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44640298/