使用C ++中的正则表达式读取空格,换行和制表符

时间:2015-09-21 10:56:31

标签: c++ regex

我正在尝试捕捉空格\s,行尾'\n''\r',制表符'\t',但没有成功。

这是我试过的:

#include <iostream>
#include <regex>

int main()
{
std::regex s ("\\s(.*)");
std::regex n ("\\n(.*)");
std::regex r ("\\r(.*)");
std::regex t ("\\t(.*)");
const char str[]=" subject \rsubject \nsubject \tsubject";
std::cmatch cmS;
std::cmatch cmN;
std::cmatch cmR;
std::cmatch cmT;
 if (std::regex_match (str, cmS,s))
     for (unsigned i=0; i<cmS.size(); ++i) {
         std::cout << "[" << cmS[i] << "] ";
     }
 if (std::regex_match (str, cmN,n))
     for (unsigned i=0; i<cmN.size(); ++i) {
         std::cout << "[" << cmN[i] << "] ";
     }
 if (std::regex_match (str, cmR,r))
     for (unsigned i=0; i<cmR.size(); ++i) {
         std::cout << "[" << cmR[i] << "] ";
     }

 if (std::regex_match (str, cmT,t))
     for (unsigned i=0; i<cmT.size(); ++i) {
         std::cout << "[" << cmT[i] << "] ";
     }

return 0;
}

我也尝试了这样但是没有任何成功,我的程序崩溃了:

if (std::regex_match ("subject subject", std::regex("\\s(sub)"),std::regex_constants::ECMAScript ))
    std::cout << "string literal matched\n";

if (std::regex_match ("subject subject", std::regex("\s(sub)"),std::regex_constants::ECMAScript ))
    std::cout << "string literal matched\n";

if (std::regex_match ("subject subject", std::regex("[[:s:]](sub)"),std::regex_constants::ECMAScript ))
    std::cout << "string literal matched\n";

我知道在C ++中有一些像boost这样的外部类来做regex,但我的目标是不对我的程序使用任何外部类和依赖项,所以我需要在C ++中这样做本身。

2 个答案:

答案 0 :(得分:3)

要启用正则表达式,您需要安装GCC 4.9.0或更高版本,因为之前的编译版本正则表达式模块不起作用。

接下来,您需要使用regex_search而不是regex_match,因为后者需要完整的字符串匹配,而您正在寻找子字符串。

请参阅regex_match说明:

  

整个目标序列必须与此函数的正则表达式匹配才能返回true(即,在匹配之前或之后没有任何其他字符)。对于仅在匹配只是序列的一部分时返回true的函数,请参阅regex_search

答案 1 :(得分:1)

如果您只需要匹配空白区域,那么我认为您无需添加(.*)

尝试在每个语句中删除(。*)。你的新陈述现在应该是这样的

std::regex s ("\\s"); 
std::regex n ("\\n"); 
std::regex r ("\\r");
std::regex t ("\\t");