c++ std::regex, smatch在模式字符串中只保留一次子表达式
c++ std::regex, smatch retains subexpressions only once for their apperance in a pattern string
我有以下代码:
int main()
{
regex reg_expr("(\([A-Z],[A-Z]\))(?:\s(\([A-Z],[A-Z]\)))*");
//regex reg_expr("(\([A-Z],[A-Z]\))(?:\s(\([A-Z],[A-Z]\)))*\s(\([A-Z],[A-Z]\))");
smatch sm;
string input("(A,B) (C,D) (F,W) (G,K) (R,M)");
//string input("(A,B) (C,D) (F,W)");
if (regex_match(input, sm, reg_expr)) {
cout << "truen";
cout << sm.size() << "n";
for (int i = 0; i < sm.size(); i++) {
//if (sm[i].length())
cout << "submatch number " << i << ": " << sm[i].str() << 'n';
}
} else
cout << "false";
return 0;
}
一切正常,除了"smatch sm"对于正则表达式字符串中指定的每个子表达式只有一个子字符串。例如,对于下面的测试字符串:
(A,B) (C,D) (F,W) (G,K) (R,M)
与
正确匹配 (([A-Z],[A-Z]))(?:s(([A-Z],[A-Z])))*
正则表达式,"sm"只有三个子字符串:一个是整个字符串,另外两个是"(A,B)"answers"(R,M)","(C,D)","(F,W)","(G,K)"缺失,但它们是匹配的。
看起来(?:s(([A-Z],[A-Z])))*
被正则表达式正确地理解为0个或更多的子表达式应该匹配,但是似乎有一个错误,只有一个子表达式存储在std::smatch sm
中。
这是一个库错误(这是不太可能的)还是我做错了什么?欢迎您的帮助和建议!
这不是一个bug,但几乎是一个普遍的行为(除了PyPi Python regex
模块,. net和(如果用适当的选项编译)Boost),当重复捕获只将最后匹配的项存储在其缓冲区中。
有关详细信息,请参阅重复捕获组与捕获重复组文章。
在您的情况下,您可以使用常规的std::sregex_iterator
:
int main() {
std::regex reg_expr(R"(([A-Z],[A-Z]))");
string input("(A,B) (C,D) (F,W) (G,K) (R,M)");
for(std::sregex_iterator i = std::sregex_iterator(input.begin(), input.end(), reg_expr);
i != std::sregex_iterator();
++i)
{
std::cout << (*i).str() << std::endl;
}
return 0;
}
参见c++演示
注意我使用的是原始字符串文字R"(...)"
,其中只需要1个反斜杠来转义regex元字符。
相关文章:
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中一次将矢量值写入多个文件
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 在一次迭代中从 txt 文件中读取多行
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- 什么是仅调用一次并调用参数的控制台应用
- 如何确保用户在一行上提示输入一次时输入名字和姓氏?
- (C++)虽然循环一次不起作用,但我引入了多个变量
- 为什么我的信号处理程序只执行一次?
- 是否允许 vector::insert 只保留一次,避免进一步的容量检查
- 如何在c++中删除一对重复出现的列表?(保留只出现一次的元素)
- c++为下一次迭代保留索引
- 为什么对变量的更改不能保留到下一次迭代?