как использовать библиотеку RE2, когда совпадающие аргументы неизвестны

Я не могу использовать RE2 :: FullMatchN, когда количество аргументов соответствия определяется во время выполнения.

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

В конце я хочу получить 2 строки в примере выше — abcd и abcd.com

0

Решение

Ты можешь использовать 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);
}
6

Другие решения


По вопросам рекламы [email protected]