我需要从匹配某种模式的字符串中收集元素。例如,让我们有以下 URI 片段:
std::string uri = "/api/customer/123/order/456/total";
这应该与以下模式匹配:
std::string pattern = "/api/customer/:customerNum:/order/:orderNum:/total";
在分析该模式时,我想收集其中的“变量”,即以冒号开头和结尾的子字符串。以下片段(改编自 Split a string using 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 匹配,返回一个变量映射及其值(包括相同变量可能多次出现的模式。