我想解析Linux中的cpu信息。我写了这样的代码:
// Returns full data of the file in a string
std::string filedata = readFile("/proc/cpuinfo");
std::cmath results;
// In file that string looks like: 'model name : Intel ...'
std::regex reg("model name: *");
std::regex_search(filedata.c_str(), results, reg);
std::cout << results[0] << " " << results[1] << std::endl;
但它返回空字符串。怎么了?
答案 0 :(得分:5)
并非所有编译器都支持完整的C ++ 11规范。值得注意的是,regex_search
在GCC中不起作用(从版本4.7.1开始),但它在VC ++ 2010中起作用。
答案 1 :(得分:3)
您没有在表达式中指定任何捕获。
考虑到/proc/cpuinfo
的结构,我可能更喜欢一条线
使用std::getline
进行导向输入,而不是尝试做
全部一起。所以你最终会得到类似的东西:
std::string line;
while ( std::getline( input, line ) ) {
static std::regex const procInfo( "model name\\s*: (.*)" );
std::cmatch results;
if ( std::regex_match( line, results, procInfo ) ) {
std::cout << "???" << " " << results[1] << std::endl;
}
}
我不清楚你想要什么作为输出。也许你也是
必须捕获processor
行,然后输出。{
开始处理器信息行。
需要注意的重要事项是:
您需要接受不同数量的空白区域:将"\\s*"
用于0或更多,"\\s+"
用于一个或多个空格字符。
您需要使用括号来界定要捕获的内容。
(FWIW:我实际上是基于boost::regex
的陈述,因为我
无法访问std::regex
。我认为他们非常相似,
但是,我上面的陈述适用于两者。)
答案 2 :(得分:2)
试试std::regex reg("model_name *: *")
。在我的cpuinfo中,冒号之前有空格。