C++ 组合两个正则表达式c++;0x
我有一个文本,其中日期可以像这样:C++ 组合两个正则表达式c++;0x,c++,regex,c++11,C++,Regex,C++11,我有一个文本,其中日期可以像这样:2011-02-02或者像这样:02/02/2011,这就是我到目前为止所写的,我的问题是,是否有一种很好的方法将这两个正则表达式组合成一个 std::regex reg1("(\\d{4})-(\\d{2})-(\\d{2})"); std::regex reg2("(\\d{2})/(\\d{2})/(\\d{4})"); smatch match; if(std::regex_search(item, match, reg1)) { Da
2011-02-02
或者像这样:02/02/2011
,这就是我到目前为止所写的,我的问题是,是否有一种很好的方法将这两个正则表达式组合成一个
std::regex reg1("(\\d{4})-(\\d{2})-(\\d{2})");
std::regex reg2("(\\d{2})/(\\d{2})/(\\d{4})");
smatch match;
if(std::regex_search(item, match, reg1))
{
Date.wYear = atoi(match[1].str().c_str());
Date.wMonth = atoi(match[2].str().c_str());
Date.wDay = atoi(match[3].str().c_str());
}
else if(std::regex_search(item, match, reg2))
{
Date.wYear = atoi(match[3].str().c_str());
Date.wMonth = atoi(match[2].str().c_str());
Date.wDay = atoi(match[1].str().c_str());
}
您可以通过
|
将这两个正则表达式组合在一起。因为只有一个|
可以匹配,所以我们可以将不同部分的捕获组连接起来,并将它们视为一个整体
std::regex reg1("(\\d{4})-(\\d{2})-(\\d{2})|(\\d{2})/(\\d{2})/(\\d{4})");
std::smatch match;
if(std::regex_search(item, match, reg1)) {
std::cout << "Year=" << atoi(match.format("$1$6").c_str()) << std::endl;
std::cout << "Month=" << atoi(match.format("$2$5").c_str()) << std::endl;
std::cout << "Day=" << atoi(match.format("$3$4").c_str()) << std::endl;
}
std::regex reg1(“(\\d{4})-(\\d{2})-(\\d{2})|(\\d{2})/(\\d{2})/(\\d{4})”;
std::smatch匹配;
if(std::regex_搜索(项目、匹配、reg1)){
std::难道有些正则表达式语法有命名组吗。PCRE有,但我认为它不支持重复的名称。也许问题是:C++0x上的任何正则表达式变体都支持重复的命名组吗?我看不出有什么好处。这比组合正则表达式更易于阅读。这有利于维护,这是一个不可忽视的因素这个代码甚至可以在没有文档的情况下阅读——结合它,您需要记录“怪物正则表达式”。@Jörgen:Ask ECMA.C++的正则表达式基于ECAMScript(Javascript)的正则表达式风格。