使用正则表达式从C ++中的一行文本中提取数据

时间:2014-04-28 14:41:34

标签: c++ regex

我有一个格式为

的文本文件
number tab word tab word tab junk
number tab word tab word tab junk
number tab word tab word tab junk
number tab word tab word tab junk
number tab word tab word tab junk

对于每一行,我想将数字放在uint32_t中,然后将这两个单词放入字符串中,然后忽略该行的其余部分。我可以通过将文件加载到内存中然后一次一个字节来完成此操作,但我确信一个可爱的正则表达式可以为我做到这一点。有什么想法吗?

我在Xcode中使用#include在C ++中工作 - 这是一个命令行工具,因此没有真正的输出,我只是存储数据以与其他数据进行比较。

2 个答案:

答案 0 :(得分:1)

extern bool DoStuff(unsigned n, 
                    const std::string &s0, 
                    const std::string &s1);

bool ProcessFile(const std::string &sFileName)
{
    std::ifstream ifs(sFileName);
    if (!ifs)
        return false;

    while (ifs)
    {
        unsigned n;
        std::string s0, s1;
        ifs >> n >> s0 >> s1;
        if (ifs.bad() || !DoStuff(n, s0, s1))
            return false;
        ifs.ignore(std::numeric_limits<int>::max(), '\n');
    }
    return !ifs.bad();
}

答案 1 :(得分:1)

马特,你可以使用这个简单的正则表达式:

(?im)^(\d+)\t([a-z]+)\t([a-z]+)

它捕获第1组中的数字,第2组中的第一个单词以及第3组中的第二个单词。

要从第1组,第2组和第3组中检索它们,我不确定您的确切C ++语法,但是此代码存根提供了如何迭代匹配和组的一个概念。请注意,在这种情况下,我们并不关心整体匹配,只关心捕获组。

try {
    TRegEx RegEx("(?im)^(\\d+)\t([a-z]+)\t([a-z]+)", TRegExOptions() << roIgnoreCase << roMultiLine);
    TMatch Match = RegEx.Match(SubjectString);
    while (Match.Success) {
        for (int i = 1; i < Match.Groups.Count; i++) {
            TGroup Group = Match.Groups[i];
            if (Group.Success) {
                // matched text: Group.Value
                // match start: Group.Index
                // match length: Group.Length
            } 
        }
        Match = Match.NextMatch();
    } 
} catch (ERegularExpressionError *ex) {
    // Syntax error in the regular expression
}