已关闭,该问题为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值解析为相应的浮点数的最佳方法是什么?正则表达式是最好的解决方案吗?还是基于令牌的字符串流更好?我的一个想法是去掉所有括号,然后用' '
分隔符再次迭代。有人有有效的方法来处理这个问题吗?
1条答案
按热度按时间5vf7fwbs1#
假设你在这里关心的行总是遵循相同的基本模式:
*ASC_SOP
后跟三组括号,每组括号包含三个浮点数,我可能会使用stringstream
。对于这种情况,我通常从一个小的固定模式matcher1开始:有了这个,我们可以做这样的匹配:
尽管模式匹配器本身并不完全直观,至少对我来说,它似乎使代码的其余部分非常清晰和易于理解(一旦你理解了它的意图,模式匹配器也不是特别困难)。
1.根据具体情况,可以将其做得更详细一些,例如如果设置了streams
skipws
标志,则使其将模式中的任何空白与输入流中的任意数量的空白相匹配。类似于scanf
和company的formst字符串。如果(例如)在一个结束括号和下一个开始括号之间可能有空格(或者制表符),也可能没有。但是一旦你有了基本的概念,如果需要的话,添加这样的东西就很容易了。