gpt4 book ai didi

c++ - C++错误中使用正则表达式的问题括号表达式中的范围无效

转载 作者:行者123 更新时间:2023-12-02 10:13:23 24 4
gpt4 key购买 nike

我的代码是将正则表达式匹配组用于5件事
这是我的代码:

#include <iostream>
#include <string>
#include <regex>

using namespace std;
int main(){


try{

string input("(66+89i)+(12+5i)");

regex re("([\\d]+)([+\\-]?[\\di]+)\\)([+\\-*=\\/!]+)\\(([\\d]+)([+\\-]?[\\di]+)");
smatch match;

if (regex_search(input, match, re)) {

cout << "x1 : " << match.str(1)<<endl;
cout << "y1 : " << match.str(2)<<endl;
cout << "operator : " << match.str(3)<<endl;
cout << "x2 : " << match.str(4)<<endl;
cout << "y2 : " << match.str(5)<<endl;

}
else {
cout << "No match is found" << endl;
}


} catch (std::regex_error r) {
cout<<r.what();
}


return 0;
}
当我运行此代码时,出现此错误“括号表达式中的范围无效”。
我怎样才能解决这个问题 ?
更新:
这段代码在c++ 17中有效,但是在c++ 14中却出现错误!
在此编译器中 link不起作用

最佳答案

请注意,对于所有未在C++ 1z / C++ 17中出现的标准,它是在g++ 7.x中修复的一个错误。 onlinegdb平台使用的旧g++ 5.4.1版本仍然存在该错误(请参阅@brc-dd comment)。
请参阅Bug 77356 - regex error for a ECMAScript syntax stringBug 77469 - std::regex x("[b\-a]") throws with message "Invalid range in bracket expression."描述该错误。这个想法是ECMAScript语法在字符类的任何位置都允许使用转义的连字符,而POSIX标准则不允许这样做(它不允许在括号表达式内进行正则表达式的转义)。
这里的问题是,即使连字符在字符类中转义,正则表达式也不会匹配。此处使用连字符的唯一方法是将其放在字符类的开头或结尾。
另外,您最好使用原始字符串文字来定义正则表达式模式。
您可以使用

regex re(R"~~~((\d+)([+-]?[\di]+)\)([+*=/!-]+)\((\d+)([+-]?[\di]+))~~~");
updated demo的输出:
x1 : 66
y1 : +89i
operator : +
x2 : 12
y2 : +5i
这里,
  • R"~~~(...)~~~"-原始字符串文字声明,\是此处的文字反斜杠,不构成字符串转义序列(因此,\t不是制表符,它是两个字符的组合,\t,尽管它仍与制表符匹配)
  • (\d+)-组1:一位或多位数字
  • ([+-]?[\di]+)-第2组:可选的+-,然后是1个以上的数字或i char
  • \)-一个)
  • ([+*=/!-]+)-第3组:一个或多个+*=/!-
  • \(-一个( char
  • (\d+)-组4:1个以上数字
  • ([+-]?[\di]+)-第5组:可选的+-,然后是1个以上的数字或i char

  • 注意:您不需要转义 /字符,它不是regex中的任何特殊regex元字符。由于C++模式是使用字符串文字定义的,而不是通常将 /用作正则表达式定界符char的正则表达式文字,因此您无需在此处将 \放在其前面。

    关于c++ - C++错误中使用正则表达式的问题括号表达式中的范围无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62731730/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com