Я хочу использовать 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
Есть ли какие-либо условия для получения суб-матчей, которые не были отменены? То есть любое положение, за исключением изменения string
s после того, как они подобраны так:
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
на нем для каждого под-матча. Как я могу избежать этого?
Вы можете просто изменить порядок, в котором вы используете результаты:
#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
Это абсолютно возможно! Ключ в том, что sub_match
наследуется от pair<BidirIt, BidirIt>
. поскольку sub_match
ES будет получен из: match_results<string::reverse_iterator> sm
, элементы pair
sub_match
наследует от будет string::reverse_iterator
s.
Так что для любого данного sub_match
от sm
вы можете получить вперед варьироваться от этого second.base()
к этому first.base()
, Вам не нужно строить string
S для потоковых диапазонов, но вам нужно будет создать 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
с по состоянию на прямо сейчас никаких действий с ними не было предпринято, но они превратились в «подгруппу эволюции».