如何使用正则表达式分隔字符串

Posted

技术标签:

【中文标题】如何使用正则表达式分隔字符串【英文标题】:How to seperate this string using by Reg Exp 【发布时间】:2015-04-16 09:56:28 【问题描述】:

对于这个字符串[268, 950][268, 954][269, 955][272, 955][270, 955][268, 953]

我想逐对获取[ , ] 中的数字。

我使用 c++ regex_search 来解析这个字符串。

这是我的测试代码:

ifstream  file("output.txt");

char regex_base[] = "[\\[0-9, 0-9\\]]10";
char regex_num[] = "[0-9]3";

regex reg_base(regex_base, regex_constants::icase);
regex reg_num(regex_base, regex_constants::icase);

if (file.is_open())

    string s;
    while (!file.eof())
        getline(file, s);
        smatch m;
        while (regex_search(s, m, reg_num)) 
            for (int i = 0; i < m.size(); i++)
                cout << m[i] << endl;
        
    

但在regex_search()while 中,变量m 只能得到[268, 950] 并形成无限循环。

我的正则表达式或代码有什么问题?

【问题讨论】:

如果我是你,我会写一个基本算法来做到这一点。 这是一个无限循环,因为您在无限循环中对同一个字符串调用它。另外,while (!file.eof()) 是错误的。 获取字符串中数字的最佳方法是什么,我很困惑。 你的模式看起来有点不对劲。试试"\\[[0-9]+, [0-9]+\\]" 【参考方案1】:

我已经删除了捕获组,因为您似乎并没有使用它们,并添加了一些代码来显示如何从您的输入字符串中获取匹配项:

char regex_base[] = "\\[[0-9]+, [0-9]+\\]";
...
s = "[268, 950][268, 954][269, 955][272, 955][270, 955][268, 953]"; // FOR TEST
smatch m;
while (regex_search(s, m, reg_num)) 

    for (auto x:m) std::cout << x << "\r\n";
    s = m.suffix().str();

输出:

如果您需要这些值,您可以使用不同的正则表达式:

char regex_base[] = "\\[([0-9]+), ([0-9]+)\\]";
...
s = "[268, 950][268, 954][269, 955][272, 955][270, 955][268, 953]";
smatch m;
while (regex_search(s, m, reg_num)) 

    std::cout << m[1] << ", " << m[2] << std::endl;
    s = m.suffix().str();

【讨论】:

谢谢,我知道了。我想念“s = m.suffix().str();”并写错正则表达式。

以上是关于如何使用正则表达式分隔字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式指定字符串分隔符?

Java使用正则表达式提取字段分隔的子字符串

基于分隔符提取字符串的正则表达式

如何确保分隔符之间的完整字符串符合正则表达式模式?

Python 正则表达式将空格分隔的单词分隔成一个列表

使用正则表达式拆分字符串时跳过逗号分隔字符串中的空格