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

时间:2015-08-04 16:55:09

标签: c++ regex string reverse reverse-iterator

我想在regex的反面使用string

我可以执行以下操作,但所有sub_match es都被颠倒了:

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;

修改

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

regex上向后运行string 而不是关于撤消找到匹配项的顺序。regex要复杂得多在这里发布是有价值的,但向后运行可以使我免于需要展望。此问题 是关于从match_results<string::reverse_iterator>获得的子匹配的处理。我需要能够将它们输入到输入中,这里foo。我不想为每个子匹配构建一个临时string并在其上运行reverse。我怎么能避免这样做。

2 个答案:

答案 0 :(得分:4)

您可以撤消使用结果的顺序:

#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

答案 1 :(得分:0)

绝对可能!关键在于a sub_match inherits from pair<BidirIt, BidirIt>。由于sub_match es将从match_results<string::reverse_iterator> sm获得,pairsub_match继承的元素将为string::reverse_iterator s。

因此,对于来自sub_match的任何sm,您可以从second.base() first.base()获取前进范围string 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); 1}}。您不必构建string_literal来流式传输范围,但您需要构建ostream_iterator

Every 0.1s: netstat -tuplna  | grep 6676    
tcp        0      0 127.0.0.1:6676          127.0.0.1:36065         TIME_WAIT   -

请记住,有一个更好的解决方案! This answer讨论了right now {{3}}之后的void Socket::close() { if (socket != 0) { apr_status_t status = apr_socket_close(socket); if (status != APR_SUCCESS) { throw SocketException(status); } socket = 0; } } 未对其采取任何行动,但他们已将其纳入&#34; Evolution子群&#34;。