1

実行時に一致する引数の数が決定される場合、RE2::FullMatchN を使用できません。

const RE2::Arg* args[10];
int n;
bool match = RE2::FullMatchN("abcd@abcd.com", "([^ @]+)@([^ @]+)", args, n);

最後に、上記の例で abcd と abcd.com の 2 つの文字列を取得したい

4

1 に答える 1

9

オブジェとしてお使いいただけRE2ます。RE2オブジェクトが正常に正規表現を解析した場合は、メソッドを呼び出すことができますNumberOfCapturingGroups()。キャプチャ グループがいくつあるかがわかれば、ポインターの配列を に動的に割り当てることができますRE2::Arg

関数の例を次に示します。

また、正規表現を '(' - ')' でラップすることをお勧めします。これは、他の多くの API のように完全一致の引数がre2デフォルトで返されないためです。0th

bool re2_full_match(const std::string & pattern, const std::string & str, std::vector<std::string> & results)
{
    std::string wrapped_pattern = "(" + pattern + ")";
    RE2::Options opt;
    opt.set_log_errors(false);
    opt.set_case_sensitive(false);
    opt.set_utf8(false);
    RE2 re2(wrapped_pattern, opt);
    if (!re2.ok()) {
        /// Failed to compile regular expression.
        return false;
    }

    /// Argument vector.
    std::vector<RE2::Arg> arguments;
    /// Vercor of pointers to arguments.
    std::vector<RE2::Arg *> arguments_ptrs;

    /// Get number of arguments.
    std::size_t args_count = re2.NumberOfCapturingGroups();

    /// Adjust vectors sizes.
    arguments.resize(args_count);
    arguments_ptrs.resize(args_count);
    results.resize(args_count);
    /// Capture pointers to stack objects and result object in vector..
    for (std::size_t i = 0; i < args_count; ++i) {
        /// Bind argument to string from vector.
        arguments[i] = &results[i];
        /// Save pointer to argument.
        arguments_ptrs[i] = &arguments[i];
    }

    return RE2::FullMatchN(StringPiece(str), re2, arguments_ptrs.data(), args_count);
}

^....$しかし、正規表現の精神から、代わりにを使用し、名前を にfull_match変更することをお勧めします。full_matchfind

bool re2_find(const std::string & pattern, const std::string & str, std::vector<std::string> & results)
{
    std::string wrapped_pattern = "(" + pattern + ")";
    RE2::Options opt;
    opt.set_log_errors(false);
    opt.set_case_sensitive(false);
    opt.set_utf8(false);
    RE2 re2(wrapped_pattern, opt);
    if (!re2.ok()) {
        /// Failed to compile regular expression.
        return false;
    }

    /// Argument vector.
    std::vector<RE2::Arg> arguments;
    /// Vercor of pointers to arguments.
    std::vector<RE2::Arg *> arguments_ptrs;

    /// Get number of arguments.
    std::size_t args_count = re2.NumberOfCapturingGroups();

    /// Adjust vectors sizes.
    arguments.resize(args_count);
    arguments_ptrs.resize(args_count);
    results.resize(args_count);
    /// Capture pointers to stack objects and result object in vector..
    for (std::size_t i = 0; i < args_count; ++i) {
        /// Bind argument to string from vector.
        arguments[i] = &results[i];
        /// Save pointer to argument.
        arguments_ptrs[i] = &arguments[i];
    }

    StringPiece piece(str);
    return RE2::FindAndConsumeN(&piece, re2, arguments_ptrs.data(), args_count);
}
于 2014-09-17T12:14:40.263 に答える