Как извлечь несопоставленную часть строки с помощью регулярного выражения

Я пытаюсь отобразить некоторые сообщения пользователю, когда ввод недействителен.

Я написал это регулярное выражение, чтобы проверить этот шаблон: (Имя из 10 символов) (Число от 0 до 9)

например Бруно 3

^([\w]{1,10})(\s[\d]{1})$

Когда пользователь вводит любую недопустимую строку, можно ли узнать, какая группа недействительна, и напечатать сообщение? Что-то такое:

if (regex_match(user_input, e))
{
  cout << "input ok" << endl;
}
else
{
    if (group1 is invalid)
    {
        cout << "The name must have length less than 10 characters" << endl;
    }

    if (group2 is invalid)
    {
        cout << "The command must be between 0 - 9" << endl;
    }
}

person Bruno    schedule 12.02.2017    source источник
comment
[\d]{1} может быть просто \d   -  person 4castle    schedule 12.02.2017
comment
Какой код вы придумали и что в нем не так?   -  person Wiktor Stribiżew    schedule 12.02.2017
comment
@WiktorStribiżew Я отредактировал вопрос   -  person Bruno    schedule 12.02.2017
comment
какова длина введенной вами строки   -  person Shakiba Moshiri    schedule 12.02.2017
comment
Поскольку нет встроенной функции, позволяющей узнать, какая часть регулярного выражения не удалась, вы можете обойти это только с помощью 2 regex_searches, одного с ^\w{1,10} и второго с \s\d$ регулярных выражений.   -  person Wiktor Stribiżew    schedule 12.02.2017
comment
Часто лучшим регулярным выражением является то, которое вы не используете. Для непосредственного написания этого теста требуется всего около четырех строк кода.   -  person Pete Becker    schedule 12.02.2017


Ответы (1)


Как я вижу, вы хотите сопоставить 1 to 10 character, затем один space, а затем один digit, но в 2 группах.

вот что вы хотите:

^([a-zA-Z]{1,10})( \d)$

ПРИМЕЧАНИЕ

\w эквивалентно [a-zA-Z0-9_]
Поэтому, если вам нужно всего 10 символов, используйте [a-zA-Z], а не \w.


Код C++

std::string string( "abcdABCDxy 9" );

std::basic_regex< char > regex( "^([a-zA-Z]{1,10})( \\d)$" );
std::match_results< std::string::const_iterator > m_result;

std::regex_match( string, m_result, regex );
std::cout << m_result[ 1 ] << '\n';   // group 1
std::cout << m_result[ 2 ] << '\n';   // group 2   

результат

1abcdABCDxy
 9
person Shakiba Moshiri    schedule 12.02.2017