如何在字符串的反面使用正则表达式?
How Can I Use a Regex on the Reverse of a string?
我想在 string
的背面使用 regex
。
我可以执行以下操作,但我的所有 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;
编辑:
我 更新问题以澄清我想要的内容:
运行 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_match
es 将从 match_results<string::reverse_iterator> sm
获得,pair
的元素 sub_match
继承自 string::reverse_iterator
s.
因此,对于 sm
中的任何给定 sub_match
,您可以获得从 second.base()
到 first.base()
的 forward 范围.您不必构造 string
s 来流式传输范围,但您需要构造一个 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_literal
s as of right now 没有对他们采取任何行动,但他们已经进入 "Evolution Subgroup"。
我想在 string
的背面使用 regex
。
我可以执行以下操作,但我的所有 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;
编辑:
我
运行 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_match
es 将从 match_results<string::reverse_iterator> sm
获得,pair
的元素 sub_match
继承自 string::reverse_iterator
s.
因此,对于 sm
中的任何给定 sub_match
,您可以获得从 second.base()
到 first.base()
的 forward 范围.您不必构造 string
s 来流式传输范围,但您需要构造一个 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);
尽管振作起来,但很快就会有更好的解决方案! string_literal
s as of right now 没有对他们采取任何行动,但他们已经进入 "Evolution Subgroup"。