Я пытаюсь сопоставить регулярное выражение со следующим кодом:

std::wstring a1 = L"/key1 val1 /key2 val2 /key3 val3";
std::wregex re(L"\/[^\/]*");
std::wsmatch ws;

if (std::regex_match(a1, ws, re))
{
    //do something
}

Я ожидаю увидеть следующую пару матчей:

/ ключ1 значение1

/ ключ2 значение2

/ key3 val3

Однако я не вижу совпадений. Есть идеи, почему?

Если я попробую с L "/.+", то, по крайней мере, я получу совпадение всей строки.

Спасибо.

1
Ahsan 4 Май 2021 в 01:09

1 ответ

Лучший ответ

Пара вещей, которые вы делаете неправильно.

  1. Проблема в том, что std::regex_match должна соответствовать всей строке, но вы пытаются сопоставить только его часть.

Вам нужно либо использовать std::regex_search, либо изменить свое регулярное выражение на сопоставить все три части сразу:

  1. В C ++ не требуется экранировать косую черту.

Ваше регулярное выражение должно быть std::wregex re(L"/[^/]*");

Окончательный код

    std::wstring a1 = L"/key1 val1 /key2 val2 /key3 val3";
    std::wregex re(L"/[^/]*");
    std::wsmatch ws;
    
    while (std::regex_search(a1, ws, re)) {
      std::wcout << ws[0].str() << '\n';
      a1 = ws.suffix().str();
    }

Изменить: спасибо Heap underrun за очень простое регулярное выражение.

1
Rishabh Deep Singh 3 Май 2021 в 23:15