参考微软C++标准库中正则表达式的介绍:https://docs.microsoft.com/zh-cn/cpp/standard-library/regular-expressions-cpp?view=msvc-160
其中捕获组Capture Group的最后一句话:In this implementation, the maximum number of capture groups is 31。就是说在当前(Visual Studio 2019)的C++标准库实现中正则表达式的捕获组数量不能超过31个。
我是在VS2010中遇到了这个问题:
#include <iostream>
#include <regex>
#include <string>
int main(int argc,char *argv[]){
std::string sBar2("16%%13225 5/6(-4)/6/5(-4)");//5%%13225(-2) _
sBar2+=" ";
std::smatch res2;
std::string rNum0("(-[0-9]+)[/ ]"),rNum1("[((](-[0-9]+)[))][/ ]"),rNum2("([0-9]+)[((](-[0-9]+)[))][/ ]"),rNum3("([0-9]+)[/ ]"); //-4/4(-4)/4/
//string rNumA("(?:(?:"+rNum0+")|(?:"+rNum1+")|(?:"+rNum2+")|(?:"+rNum3+"))"); //外层不捕获,一共5个捕获组
std::string rNumA("(("+rNum0+")|("+rNum1+")|("+rNum2+")|("+rNum3+"))"); //一共10个捕获组
//string rNumA("[("+rNum1+")("+rNum2+")("+rNum3+")]");
std::regex rMainBar1("([0-9]+)(%%[0-9]+) "+rNumA);
std::regex rMainBar2("([0-9]+)(%%[0-9]+) "+rNumA+rNumA);
std::regex rMainBar25("([0-9]+)%%[0-9]+ "+rNumA+rNumA+rNumA); //31个捕获组,将将够
std::regex rMainBar3("([0-9]+)(%%[0-9]+) "+rNumA+rNumA+rNumA); //32个捕获组,崩溃
std::cin>>sBar2;
}
在mac XCode 的C++标准库实现中没有31个捕获组数量的限制,能够正常执行。
本文探讨了C++标准库中正则表达式的捕获组数量限制问题,在Visual Studio 2019中该限制为31个,并提供了一个具体的示例代码。此外,还对比了macOS Xcode平台上的实现不受此限制。
185

被折叠的 条评论
为什么被折叠?



