4

我想在 aregex的反面使用 a string

我可以执行以下操作,但我所有的sub_matches 都颠倒了:

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";
}

[现场示例]

我想要的是出去:

同义词

是否有任何规定可以得到不被逆转的子比赛?也就是说,除了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要颠倒找到匹配项的顺序。它要复杂得多,在这里发布很有价值,但是向后运行它可以让我不需要向前看。这个问题关于处理从. 我需要能够将它们从输入中取出,在这里。我不想为每个子比赛构建一个临时的并在其上运行。我怎样才能避免这样做。regexmatch_results<string::reverse_iterator>foostringreverse

4

2 回答 2

5

您可以颠倒使用结果的顺序:

#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
于 2015-08-04T17:08:08.733 回答
0

这是绝对可能的!关键在于asub_match继承自pair<BidirIt, BidirIt>. 由于sub_matches 将从: 获得,因此a继承自match_results<string::reverse_iterator> sm的元素将是s。pairsub_matchstring::reverse_iterator

因此,对于任何给定sub_match的,sm您都可以获得从 it's到 it's的正向范围。您不必构造s 来流式传输范围,但您需要构造一个:second.base()first.base()stringostream_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_literals目前尚未对它们采取任何行动,但它们已将其纳入“进化子组”。

于 2015-08-05T11:21:48.510 回答