gpt4 book ai didi

c++ - 在 C++ 中收集模式元素

转载 作者:太空宇宙 更新时间:2023-11-04 12:00:05 25 4
gpt4 key购买 nike

我需要从匹配某种模式的字符串中收集元素。例如,我们有以下 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 匹配,返回变量及其值的映射(包括相同变量可能出现多次的模式。

最佳答案

也许我应该完全删除我的问题。 regex_token_iterator 类已经预料到了这种需求。这个想法是在其构造函数中使用可选的第四个参数:

std::sregex_token_iterator
first ( uriPattern.begin(), uriPattern.end(), re, 1),
last;

1 表示“我对匹配的第一个子表达式感兴趣”。默认值 0 表示“我对匹配项感兴趣”,-1 表示“我对匹配项之间的文本感兴趣”。

(仍然欢迎其他评论)。

关于c++ - 在 C++ 中收集模式元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14475604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com