c++ - 当我认为它不应该在 C++ 中时,正则表达式采用等号

标签 c++ regex eclipse c++11

所以我应该接受用户输入并评估用户输入是否是有效的中缀表达式。我只接受 + -/* ( ) 和数字。 所以最简单的方法是使用正则表达式。

这是我的正则表达式:[\(\)\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/

相关文章:

c++ - 使用 MergeCom 将私有(private)标记添加到 DICOM 时出现问题

c++ - 逐步将 gcov 与 CMake 结合使用

regex - 如何在不设置变量的情况下进行perl内联正则表达式?

java - 是否有按修饰符对成员进行排序的 Eclipse 快捷方式?

eclipse - War getting Err404 by Tomcat7 但如果它在 Eclipse 上运行一切正常

c++ - void()、逗号运算符 (operator,) 和不可能的 (?) 重载

c++ - 通过 using 继承构造函数,但使其越线

Python正则表达式排除以字符串结尾

java - Spring Boot Controller 中未发生正则表达式验证

java - Java 中的 HttpServlet 错误