C++11 正则表达式子匹配

标签 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

有人可以给我一些关于如何实现这一目标的建议吗?感谢所有的帮助。

最佳答案

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

这对我有用:

\\[([^-\\]]+)->([0-9]+)\\]

[...] 开头的“^”使得除“-”之外的所有字符都被接受,这样您就可以避免“->”和“]”

关于C++11 正则表达式子匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41350027/

相关文章:

c++ - 是否保证为返回 void 的函数调用 std::async?

c++ - 使用 Qt 下载公共(public)保管箱文件

任何文件扩展名的正则表达式

regex - 仅打印带有大写字母的单词 (Linux)

c++ - 我可以制作一个线程安全的 std::atomic<vector<int>> 吗?

c++ - 异常保证和快速 push_back

c++ - OpenCV输出奇数像素值

c++ - 虚函数返回的枚举协方差

c++ - 使用 boost copy 将结构体成员作为键映射复制到集合容器中

python - 如果连续 N 个单词都是大写,则不匹配的正则表达式