收集C++中的图案元素
collecting pattern elements in C++
我需要从字符串中收集与某种模式匹配的元素。例如,让我们有以下 URI 片段:
std::string uri = "/api/customer/123/order/456/total";
这应该与以下模式相匹配:
std::string pattern = "/api/customer/:customerNum:/order/:orderNum:/total";
在分析该模式时,我想收集其中的"变量",即以冒号开头和结尾的子字符串。以下代码片段(改编自使用 C++11 拆分字符串)几乎可以完成这项工作:
std::set<std::string> patternVariables(const std::string &uriPattern)
{
std::regex re(":([^:]+):"); // find a word surrounded by ":"
std::sregex_token_iterator
first ( uriPattern.begin(), uriPattern.end(), re),
last;
std::set<std::string> comp = {first, last};
return comp;
}
该代码段的问题在于它收集了包括":"标记在内的变量。收集没有冒号的变量(即匹配中的1
,而不是匹配本身)的惯用方法是什么?我可以手动迭代正则表达式匹配项并在循环中累积匹配项,但我怀疑可能有类似于{first, last}
表达式的更优雅的东西。
假设我的上下文很清楚,也欢迎任何考虑到它的评论:
- 在我的模式中标记变量的更好约定
- 关于更好的正则表达式的建议
- 对工作流下一步的前瞻性思考:将模式与实际 URI 匹配,返回变量及其值的映射(包括同一变量可能多次出现的模式)。
也许我应该完全删除我的问题。班级regex_token_iterator
已经预料到了这种需求。这个想法是在其构造函数中使用可选的第 4 个参数,因此:
std::sregex_token_iterator
first ( uriPattern.begin(), uriPattern.end(), re, 1),
last;
1
的意思是"我对匹配的第一个子表达式感兴趣"。默认值 0
表示"我对匹配项感兴趣",-1
表示"我对匹配项之间的文本感兴趣"。
(其他评论仍然欢迎)。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何通过 getter 函数删除矢量的元素?
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 从控制台中删除最后打印的元素
- 擦除while循环中迭代的元素