Вы бы использовали что-то вроде:
(^[0-9]{5}$)|^(?:[0-9]{0,5})(.*)$
Есть два захвата и группа без захвата (одна в (?:...)
)
Первый - для «правильных» данных. Строка состоит из 5 цифр. В противном случае пропускаются 0-5 цифр, и первый «неправильный» символ помещается во второй захват (.?)
. Обратите внимание, что этот захват будет успешным, даже если строка пуста.
Маленький образец:
std::regex const string_matcher("(^[0-9]{5}$)|^(?:[0-9]{0,5})(.*)$");
std::match_results<std::string::const_iterator> match;
std::string str("123456");
std::cout << "Success: " << std::boolalpha << std::regex_match(str, match, string_matcher) << std::endl;
std::cout << "Num of sub-matches: " << match.size() << std::endl;
std::cout << "Success capture: " << std::boolalpha << match[1].matched << " at " << match.position(1) << ": '" << match[1].str() << "'" << std::endl;
std::cout << "First failed character: " << std::boolalpha << match[2].matched << " at " << match.position(2) << ": '" << match[2].str() << "'" << std::endl;
(к сожалению, я не могу скомпилировать его на ideone, потому что он не поддерживает регулярные выражения, протестировано на VC ++)
Проверьте это с помощью:
(empty string)
1
AA
1AA
12345
123456
12345AA