あるパターンに一致する文字列から要素を収集する必要があります。たとえば、次の 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 に一致させ、変数とその値のマップを返します (同じ変数が複数回出現する可能性のあるパターンを含む)。