如何在字符串的反向使用正则表达式?

Jon*_*Mee 4 c++ regex string reverse reverse-iterator

我想在 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";
}
Run Code Online (Sandbox Code Playgroud)

[现场示例]

我想要的是出去:

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;
Run Code Online (Sandbox Code Playgroud)

编辑:

已建议我更新的问题,以澄清我想要的东西:

运行regex的倒退string没有关于扭转这一比赛被发现在顺序。该regex情况要复杂得多,这将是宝贵的,张贴在这里,但运行它向后节省了我从需要前瞻。这个问题关于处理从match_results<string::reverse_iterator>. 我需要能够像他们在输入中一样将它们取出,here foo。我不想为每个子比赛构建一个临时的string并运行reverse它。我怎样才能避免这样做。

Gal*_*lik 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

ipsum lorem
Run Code Online (Sandbox Code Playgroud)

  • @JonathanMee 好吧,也许您可​​以尝试发布实际的正则表达式?或者至少与您的问题具有相同的棘手性? (3认同)