c ++ 11中的正则表达式

时间:2012-08-08 09:58:47

标签: c++ regex linux c++11

我想解析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;

但它返回空字符串。怎么了?

3 个答案:

答案 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行,然后输出。{ 开始处理器信息行。

需要注意的重要事项是:

  1. 您需要接受不同数量的空白区域:将"\\s*"用于0或更多,"\\s+"用于一个或多个空格字符。

  2. 您需要使用括号来界定要捕获的内容。

  3. (FWIW:我实际上是基于boost::regex的陈述,因为我 无法访问std::regex。我认为他们非常相似, 但是,我上面的陈述适用于两者。)

答案 2 :(得分:2)

试试std::regex reg("model_name *: *")。在我的cpuinfo中,冒号之前有空格。