有没有办法丢弃空捕获
Is There a Way to Discard Empty Captures?
本文关键字:有没有 更新时间:2023-10-16
是否有一种内置的方法可以只迭代非空捕获,或者我是否需要使用lambda/修改我的正则表达式?
例如,给定:const auto input = "Peas&Carrots Spinach-Casserole Beets Pizza Spinach-Salad Coleslaw"s
,我想找到不含"菠菜"的食物。所以我可以这样做:
const regex re{ "\s*(?:\S*Spinach\S*|(\S*))" };
copy(sregex_token_iterator(cbegin(input), cend(input), re, 1), sregex_token_iterator(), ostream_iterator<string>(cout, "n"));
当然,问题是我得到的输出是:
豌豆;胡萝卜
甜菜
披萨
Coleslaw
有办法绕过这个吗?
您可以使用std::copy_if
和lambda来检查正则表达式匹配中的字符串是否为空。使用
copy_if(sregex_token_iterator(cbegin(input), cend(input), re, 1),
sregex_token_iterator(), ostream_iterator<string>(cout, "n"),
[](const std::string& match){ return !match.empty(); });
我们得到
Peas&Carrots
Beets
Pizza
Coleslaw
实时示例
因为它只会打印非空字符串。
显而易见的方法是使用std::copy_if
(或std::remove_copy_if
),并仅在字符串为非空时复制该字符串。
remove_copy_if(
sregex_token_iterator(cbegin(input), cend(input), re, 1),
sregex_token_iterator(),
ostream_iterator<string>(cout, "n"),
[](string const &s) { return s.empty(); }
);
从那些比我聪明的人的回答来看,如果没有lambda,实际上似乎没有办法丢弃空结果。在这个问题上,有几个替代方案:
- 使用"向前看",这有点贵,但只捕捉没有"菠菜"的单词:
const regex re{ "(?:\s+|^)(?!Spinach)(\S+)" };
copy(sregex_token_iterator(cbegin(input), cend(input), re, 1), sregex_token_iterator(), ostream_iterator<string>(cout, "n"));
实时示例
- 使用
istream_iterator
和lambda,这消除了lambda的很多灵活性,但由于input
是用空格分隔的,这可能是最好的选择:
istringstream{ input };
copy_if(istream_iterator<string>(cbegin(input), cend(input)), istream_iterator<string>(), ostream_iterator<string>(cout, "n"), [](const auto& i) { return i.find("Spinach") == string::npos; });
实时示例
相关文章:
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 遇到新行时,有没有办法停止istream_iterator
- 有没有一种方法可以在编译时获得作用域类名
- conan有没有办法导出一个空目录
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 有没有可能有一个只有ADL才能找到的非好友功能
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 有没有办法知道Tracer是否成功地完全连接到了jaegerclientcpp中的jaeger后端服务器
- catch框架有没有办法比较流或文件
- 有没有任务栏API可以立即应用注册表更改
- 铸造标准::有没有回到原来的类型
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践