Объединение двух регулярных выражений c ++ 0x - PullRequest
5 голосов
/ 28 апреля 2011

У меня есть текст, где дата может выглядеть так: 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());
}

1 Ответ

5 голосов
/ 28 апреля 2011

Вы можете объединить два регулярных выражения с помощью |. Поскольку только один из | может быть сопоставлен, мы можем затем объединить группы захвата различных частей и представить их как единое целое.

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;
} 

(К сожалению, регулярное выражение C ++ 0x не поддерживает именованную группу захвата, в противном случае я бы предложил перебрать массив регулярных выражений, используя вместо этого именованный захват.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...