我正在尝试捕捉空格\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 ++中这样做本身。
答案 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");