C++ multidata text parse via regex [已关闭]

nwwlzxa7  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(118)

已关闭,该问题为opinion-based,目前不接受回答。
**想改进这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。

8小时前关闭
Improve this question
要分析的文本:

001  B001C001_230130_RQ7V V     C        04:23:30:18 04:24:14:01 01:00:00:00 01:00:43:08  
*ASC_SOP (1.000000 1.000000 1.000000)(0.000000 0.000000 0.000000)(1.000000 1.000000 1.000000)
*ASC_SAT 1.000000

我正在尝试将 *ASC_SOP三元组解析为3x float[3]数组。
加载源文件并逐行传递给parse()函数。当前函数如下所示:

inline void parse(std::string &line) {

    //regex to match edl id's camera reel and slope values
    std::regex edlID("^([0-9]{3})");
    std::regex camReel("([A-Za-z]([0-9]{3}))\\S+");
    std::regex SOP("(?:[0-9][.][0-9]{6})");

    std::smatch mID, reelID, sopMatch; //regex matchers

    //check if there is an edlID. As per CM3600 spec this is always the first column
    if(std::regex_search(line, mID, edlID)) {
        std::regex_search(line, reelID, camReel); //next we check for a clip/reel name combo
        std::cout << "EDL ID: " << mID[0] << " Clip: " << reelID[0] << std::endl;
    }
}

将 *ASC_SOP值和ASC_SAT值解析为相应的浮点数的最佳方法是什么?正则表达式是最好的解决方案吗?还是基于令牌的字符串流更好?我的一个想法是去掉所有括号,然后用' '分隔符再次迭代。有人有有效的方法来处理这个问题吗?

5vf7fwbs

5vf7fwbs1#

假设你在这里关心的行总是遵循相同的基本模式:*ASC_SOP后跟三组括号,每组括号包含三个浮点数,我可能会使用stringstream。对于这种情况,我通常从一个小的固定模式matcher1开始:

std::istream &operator>>(std::istream &is, char const *pat) {
    while (is.peek() == *pat) {
        ++pat;
        is.ignore(1);
    }
    if (*pat)
        is.setstate(std::ios::failbit);
    return is;
}

有了这个,我们可以做这样的匹配:

float a[3], b[3], c[3];

    if (input >> "*ASC_SOP (" >> a[0] >> a[1] >> a[2] >> ")(" 
                              >> b[0] >> b[1] >> b[2] >> ")(" 
                              >> c[0] >> c[1] >> c[2] >> ")") 
    {
        std::cout << "parsed ASC_SOP\n";
    } else {
        std::cerr << "Attempt at parsing ASC_SOP failed\n";
    }

尽管模式匹配器本身并不完全直观,至少对我来说,它似乎使代码的其余部分非常清晰和易于理解(一旦你理解了它的意图,模式匹配器也不是特别困难)。
1.根据具体情况,可以将其做得更详细一些,例如如果设置了streams skipws标志,则使其将模式中的任何空白与输入流中的任意数量的空白相匹配。类似于scanf和company的formst字符串。如果(例如)在一个结束括号和下一个开始括号之间可能有空格(或者制表符),也可能没有。但是一旦你有了基本的概念,如果需要的话,添加这样的东西就很容易了。

相关问题