我想在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";
}
我想要的是离开:
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
。我怎么能避免这样做。
答案 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
获得,pair
和sub_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;。