C ++ 11 Regex子匹配

时间:2016-12-27 18:05:55

标签: c++ regex c++11

我有以下代码来提取左侧&右侧部分来自

类型的字符串
  

[3→1],[2→2],[5→3]

我的代码如下所示

#include <iostream>
#include <regex>
#include <string>

using namespace std;

int main()
{
    regex expr("([[:d:]]+)->([[:d:]]+)"); 
    string input = "[3->1],[2->2],[5->3]";

    const std::sregex_token_iterator end;
    int submatches[] = { 1, 2 };
    string left, right;

    for (std::sregex_token_iterator itr(input.begin(), input.end(), expr, submatches); itr != end;)
    {
        left    = ((*itr).str()); ++itr;
        right   = ((*itr).str()); ++itr;

        cout << left << "      " << right << endl;
    }
}

输出

3      1
2      2
5      3

现在我试图扩展它,以便第一部分将是一个字符串而不是数字。例如,输入将是

  

[(3),(5),(0,1) - →2],[(32,2) - →6],[(27),(61,11) - →1]

我需要将其拆分为

(3),(5),(0,1)    2
(32,2)           6
(27),(61,11)     1

我尝试("(\\(.*+)->([[:d:]]+)")的基本表达式只是将整个字符串拆分为两个

(3),(5),(0,1)->2],[(32,2)->6],[(27),(61,11)      1

有人可以就如何实现这一点给我一些建议吗?感谢所有帮助。

2 个答案:

答案 0 :(得分:2)

你需要在第一个'['之后获得所有内容,除了“ - &gt;”之外,有点像if 你正在为多行注释/ * ... * /做一个正则表达式,其中必须排除“* /”,否则正则表达式变得贪婪并吃掉所有内容直到最后一个,就像在你的情况下发生的那样“ - &gt;”中。你不能真正将点用于任何char,因为它非常贪婪。

这对我有用:

\\[([^-\\]]+)->([0-9]+)\\]
在[...]开始时的

'^'使得除了' - '之外的所有字符,所以你可以避免接受“ - &gt;”和']'

答案 1 :(得分:2)

你需要的是使它更具体:

\[([^]]*)->([^]]*)\]

为了避免捕获太多数据。请参阅live demo

您可以使用.*?模式而不是[^]]*,但效率会低一些。