Я не могу использовать RE2 :: FullMatchN, когда количество аргументов соответствия определяется во время выполнения.
const RE2::Arg* args[10];
int n;
bool match = RE2::FullMatchN("[email protected]", "([^ @]+)@([^ @]+)", args, n);
В конце я хочу получить 2 строки в примере выше — abcd и abcd.com
Ты можешь использовать RE2
как объект. Если RE2
объект успешно проанализировал регулярное выражение, которое вы можете вызвать NumberOfCapturingGroups()
метод. Зная, сколько групп захвата существует, вы можете динамически распределить массив указателей на RE2::Arg
,
Вот пример функции:
Я также предлагаю вам обернуть регулярное выражение в ‘(‘ — ‘)’, так как re2
не возвращается по умолчанию 0th
аргумент для полного соответствия, как и многие другие API.
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);
}