с ++ регулярное выражение в цикле - PullRequest
0 голосов
/ 05 февраля 2019

Следующие попытки получить "a" из "A: a" и "b" из "B: b" и "c" из "C: c", выполнив поиск регулярных выражений в цикле.На первой итерации внешнего цикла во второй группе m появляется «a».Однако для второй итерации внешнего цикла в третьей группе m появляется «b».А для третьей итерации внешнего цикла «c» появляется в четвертой группе m.Это почему?Кроме того, первая итерация внешнего цикла имеет 4 группы по m.Это почему?Разве не должно быть двух групп?

std::string s = "abc\n"
    "A:a\n"
    "def\n"
    "B:b\n"
    "ghi\n"
    "C:c\n\n"
    "jkl\n";
std::regex p("\nA:\\s*([^\n]+)|\nB:\\s*([^\n]+)|\nC:\\s*([^\n]+)");
std::smatch m;

while (std::regex_search(s, m, p))
{
    int count = 0;
    for (auto x:m)
    {
        std::cout << count << "->" << x << ", ";
        count++;
    }
    s = m.suffix().str();
}

Вывод

0->
A:a, 1->a, 2->, 3->, 0->
B:b, 1->, 2->b, 3->, 0->
C:c, 1->, 2->, 3->c, 

Ожидаемый:

0->
A:a, 1->a, 0->
B:b, 1->b, 0->
C:c, 1->c, 

1 Ответ

0 голосов
/ 05 февраля 2019

Номера групп не сбрасываются в каждой альтернативе.

Поскольку все ваши альтернативы одинаковы, за исключением буквы в начале, вы можете просто объединить их в одну альтернативу и сопоставить букву с [ABC].

std::regex p("\n[ABC]:\\s*([^\n]+)");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...