c std:: regex не соответствует ожидаемому

#c #regex

#c #регулярное выражение

Вопрос:

Я попытался реализовать простой метод проверки строк, используя c std:: regex, в MS VC 2012.

 const std::string str = "1.0.0.0029.443";

if ( std::regex_match( str, std::regex( "\.0\d " ) ) )
    std::cout << "matched." << std::endl;
  

Я предположил, что код будет соответствовать «.0029» части данного str. Однако оно вообще не соответствует.
Я попробовал это на http://regex101.com / и это сработало.

Ответ №1:

Используйте std::regex_search вместо этого, чтобы вернуть ваше подчиненное соответствие.

 const std::string str = "1.0.0.0029.443";

std::regex rgx("(\.0[0-9] )");
std::smatch match;

if (std::regex_search(str.begin(), str.end(), match, rgx)) {
    std::cout << match[1] << 'n';
}
  

Ответ №2:

std::regex_match сообщает о точном совпадении, т. Е. Вся входная строка должна соответствовать регулярному выражению.

Чтобы сопоставить подпоследовательности, используйте std::regex_search .

Ответ №3:

Чтобы убедиться, что ваше регулярное выражение соответствует полной строке и ничего больше, вам нужно что-то вроде этого:

 ^(?:d .)*d $
  

Это приводит к

 if ( std::regex_match( str, std::regex( "^(?:\d \.)*\d $" ) ) )
    std::cout << "matched." << std::endl;
  

Начало и конец привязок ^ и $ обязательны, в противном случае вы можете сопоставить строку в середине BANANA_0.1.12AND_APPLE