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

How Can I Use a Regex on the Reverse of a string?

我想在 string 的背面使用 regex

我可以执行以下操作,但我的所有 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";
}

[Live example]

我要的是滚出去:

ipsum lorem

有没有规定获取不反转的子匹配?也就是说,在 string 像这样匹配后,除了反转它们之外的任何规定:

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

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

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

编辑:

更新问题以澄清我想要的内容:

运行 string 上的 regex 而不是 关于颠倒匹配项的顺序。 regex 复杂得多,对 post 在这里很有价值,但是 运行 倒着它使我无需向前看。这个问题关于如何处理从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

这绝对有可能!关键在于 a sub_match inherits from pair<BidirIt, BidirIt>。由于 sub_matches 将从 match_results<string::reverse_iterator> sm 获得,pair 的元素 sub_match 继承自 string::reverse_iterators.

因此,对于 sm 中的任何给定 sub_match,您可以获得从 second.base()first.base()forward 范围.您不必构造 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);

尽管振作起来,但很快就会有更好的解决方案! discusses string_literals as of right now 没有对他们采取任何行动,但他们已经进入 "Evolution Subgroup"。