我想找到所有类似“{some text}”的内容。
我的代码是:
std::wregex e(L"(\\{([a-z]+)\\})");
std::wsmatch m;
std::regex_search(chatMessage, m, e);
std::wcout << "matches for '" << chatMessage << "'\n";
for (size_t i = 0; i < m.size(); ++i) {
std::wssub_match sub_match = m[i];
std::wstring sub_match_str = sub_match.str();
std::wcout << i << ": " << sub_match_str << '\n';
}
但是对于这样的字符串:L“Roses {aaa} {bbb}是{ccc} #ff0000”)我的输出是:
0: {aaa}
1: {aaa}
2: aaa
我不会得到下一个子串。我怀疑我的正则表达式有问题。你们中有谁看到了什么问题吗?
答案 0 :(得分:5)
您正在搜索一次并简单地循环浏览群组。您需要多次搜索并仅返回正确的组。尝试:
std::wregex e(L"(\\{([a-z]+)\\})");
std::wsmatch m;
std::wcout << "matches for '" << chatMessage << "'\n";
while (std::regex_search(chatMessage, m, e))
{
std::wssub_match sub_match = m[2];
std::wstring sub_match_str = sub_match.str();
std::wcout << sub_match_str << '\n';
chatMessage = m.suffix().str(); // this advances the position in the string
}
2
这是第二组,即括号中的第二组,即([a-z]+)
。
有关群组的详情,请参阅this。
答案 1 :(得分:2)
正则表达式没有任何问题,但您需要重复搜索它。而且你还是不需要括号。
std::regex_search
找到一个模式的出现。这是{aaa}
。 std::wsmatch
就是这样。它有3个子匹配。整个字符串,外括号的内容(再次是整个字符串)和内括号的内容。这就是你所看到的。
您必须再次在字符串的其余部分调用regex_search
以获得下一个匹配项:
std::wstring::const_iterator begin = chatMessage.begin(), end = chatMessage.end();
while (std::regex_search(begin, end, m, e)) {
// ...
begin = m.end();
}
答案 2 :(得分:1)
regex_match
对象上的索引运算符返回该索引处的匹配子字符串。当索引为0时,它返回整个匹配字符串,这就是第一行输出为{aaa}
的原因。当索引为1时,它返回第一个捕获组的内容,即正则表达式中位于第一个(
和相应)
之间的部分匹配的文本。在这个例子中,那些是最外面的括号,它再次产生{abc}
。当索引为2时,将返回第二个捕获组的内容,即第二个(
与其对应的)
之间的文本,从而为您提供aaa
。
从中断位置再次搜索的最简单方法是使用迭代器:
std::wsregex_iterator it(chatMessage.begin(), chatMessage.end(), e);
for ( ; it != wsregex_iterator(); ++it) {
std::cout << *it << '\n';
}
(注意:这是草图,未经测试)