実行時に一致する引数の数が決定される場合、RE2::FullMatchN を使用できません。
const RE2::Arg* args[10];
int n;
bool match = RE2::FullMatchN("abcd@abcd.com", "([^ @]+)@([^ @]+)", args, n);
最後に、上記の例で abcd と abcd.com の 2 つの文字列を取得したい
オブジェとしてお使いいただけ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_match
find
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);
}