#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