std c ++中的正则表达式

时间:2013-08-05 11:07:30

标签: c++ regex

我想找到所有类似“{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

我不会得到下一个子串。我怀疑我的正则表达式有问题。你们中有谁看到了什么问题吗?

3 个答案:

答案 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';
}

(注意:这是草图,未经测试)