Как я могу использовать регулярное выражение на обратной стороне строки?

Я хочу использовать regex на обратной стороне string,

Я могу сделать следующее, но все мои sub_matchони поменялись местами:

string foo("lorem ipsum");
match_results<string::reverse_iterator> sm;

if (regex_match(foo.rbegin(), foo.rend(), sm, regex("(\\w+)\\s+(\\w+)"))) {
cout << sm[1] << ' ' << sm[2] << endl;
}
else {
cout << "bad\n";
}
[Живой пример]

Я хочу выйти:

Ipsum Lorem

Есть ли какие-либо условия для получения суб-матчей, которые не были отменены? То есть любое положение, за исключением изменения strings после того, как они подобраны так:

string first(sm[1]);
string second(sm[2]);

reverse(first.begin(), first.end());
reverse(second.begin(), second.end());

cout << first << ' ' << second << endl;

РЕДАКТИРОВАТЬ:

Это было предложено что я обновляю вопрос, чтобы уточнить, чего я хочу:

Запуск regex назад на string является не об изменении порядка, в котором найдены совпадения. regex гораздо сложнее, что было бы полезно опубликовать здесь, но запуск его задом наперед избавляет меня от необходимости заглядывать в будущее. Этот вопрос является об обработке под-матчей, полученных из match_results<string::reverse_iterator>, Я должен быть в состоянии получить их, как они были на входе, здесь foo, Я не хочу строить временный string и беги reverse на нем для каждого под-матча. Как я могу избежать этого?

3

Решение

Вы можете просто изменить порядок, в котором вы используете результаты:

#include <regex>
#include <string>
#include <iostream>

using namespace std;

int main()
{
string foo("lorem ipsum");
smatch sm;

if (regex_match(foo, sm, regex("(\\w+)\\s+(\\w+)"))) {
cout << sm[2] << ' ' << sm[1] << endl; // use second as first
}
else {
cout << "bad\n";
}
}

Выход:

ipsum lorem
4

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

Это абсолютно возможно! Ключ в том, что sub_match наследуется от pair<BidirIt, BidirIt>. поскольку sub_matchES будет получен из: match_results<string::reverse_iterator> sm, элементы pair sub_match наследует от будет string::reverse_iterators.

Так что для любого данного sub_match от sm вы можете получить вперед варьироваться от этого second.base() к этому first.base(), Вам не нужно строить stringS для потоковых диапазонов, но вам нужно будет создать ostream_iterator:

ostream_iterator<char> output(cout);

copy(sm[1].second.base(), sm[1].first.base(), output);
output = ' ';
copy(sm[2].second.base(), sm[2].first.base(), output);

Примите во внимание, что есть лучшее решение на горизонте! Этот ответ обсуждается string_literalс по состоянию на прямо сейчас никаких действий с ними не было предпринято, но они превратились в «подгруппу эволюции».

0

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