1

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

1 に答える 1

1

たぶん、質問を完全に削除する必要があります。クラスregex_token_iteratorはすでにその必要性を予測しています。アイデアは、オプションの 4 番目のパラメーターをそのコンストラクターに使用することです。

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

これ1は、「一致する最初の部分式に興味がある」という意味です。のデフォルト値は0「マッチに興味がある」を-1意味し、「マッチ間のテキストに興味がある」を意味します。

(その他のコメントは引き続き歓迎します)。

于 2013-01-23T09:31:54.430 に答える