В настоящее время я пытаюсь создать регулярное выражение, которое соответствует параметрам URL и извлекает их.C++ Regex: non-greedy match
Например, если я получил следующие параметры строки ?param1=someValue¶m2=someOtherValue
, std::regex_match
следует извлечь следующее содержание:
param1
some_content
param2
some_other_content
Af Попробуйте различные шаблоны регулярных выражений, я, наконец, построил один, соответствующий тому, что я хочу: std::regex("(?:[\\?&]([^=&]+)=([^=&]+))*")
.
Если я возьму предыдущий пример, std::regex_match
соответствует ожиданиям. Однако он не извлекает ожидаемые значения, сохраняя только последние зафиксированные значения.
Например, следующий код:
std::regex paramsRegex("(?:[\\?&]([^=&]+)=([^=&]+))*");
std::string arg = "?param1=someValue¶m2=someOtherValue";
std::smatch sm;
std::regex_match(arg, sm, paramsRegex);
for (const auto &match : sm)
std::cout << match << std::endl;
даст следующий вывод:
param2
someOtherValue
Как вы можете видеть, param1 и его значение пропускаются и не учитываются.
После поиска в google я обнаружил, что это связано с жадным захватом, и я изменил свое регулярное выражение на "(?:[\\?&]([^=&]+)=([^=&]+))\\*?"
, чтобы включить нежеланный захват.
Это регулярное выражение работает хорошо, когда я пытаюсь его на rubular, но он не совпадает, когда я использую его в C++ (std::regex_match
возвращает false и ничего не фиксируется).
Я пробовал разные варианты std::regex_constants
(различные грамматики регулярных выражений с использованием std::regex_constants::grep
, std::regex_constants::egrep
, ...), но результат тот же.
Кто-нибудь знает, как сделать непривлекательный захват регулярных выражений на C++?
Каждый repeatition из группы захвата перезаписывать предыдущий. Вам нужно удалить квантификатор '[? &] ([^ =] +) = ([^ &] +)' И использовать итератор regex для получения разных совпадений: http://en.cppreference.com/w/cpp/regex/regex_iterator. Это не жадная/не жадная проблема. –
Спасибо за объяснения: я пробовал с regex_iterators, и он работает хорошо! –