Хмм ... В зависимости от конкретной версии Regex, которую вы используете, подумайте:
(?P<id>\d{3})(?=[A-Za-z\s]{16}\d)(?P<username>[A-Za-z]{8,16})\s*(?P<phone>\d{8})
Заметьте, что на 100% это сработает, и я использовал экранирующий символ пробела вместо реального пробела - я сам нервничаю только из-за символа пробела, но вы, возможно, захотите быть более ограничительным.
Посмотрите, работает ли это. Я сам являюсь лишь посредником в RegEx, поэтому могу ошибаться.
Проверьте синтаксис именованных групп для вашей версии RegEx a) существует и b) соответствует стандарту, который я использовал выше.
EDIT:
Просто чтобы расширить то, что я пытаюсь сделать (извините, что у вас кровоточат глаза, Пакс!) Для тех, у кого нет большого опыта в RegEx:
(?P<id>\d{3})
Эта попытка будет соответствовать именованной группе захвата - 'id' - длиной в три цифры. Большинство версий RegEx позволяют использовать именованные группы захвата для извлечения значений, с которыми вы сопоставляете. Это позволяет выполнять проверку и захват данных одновременно . Разные версии RegEx имеют немного разные синтаксисы для этого - проверьте http://www.regular -expressions.info / named.html для более подробной информации о вашей конкретной реализации.
(?=[A-Za-z\s]{16}\d)
Оператор? = Является прогнозным. Это будет смотреть вперед для следующих шестнадцати символов и вернет true, если все они являются буквами или пробельными символами И, за которыми следует цифра. Оператор lookahead имеет нулевую длину, поэтому он ничего не возвращает. Ваша строка RegEx продолжает идти с того места, где стартовал Lookahead. Проверьте http://www.regular -expressions.info / lookaround.html для более подробной информации о перспективах.
(?P<username>[A-Za-z]{8,16})\s*
Если оглядка проходит, то мы продолжаем считать с четвертого символа. Мы хотим найти от восьми до шестнадцати символов, за которыми следуют ноль или более пробелов. «Или больше» на самом деле безопасно, поскольку мы уже убедились в том, что до следующей цифры не может быть более шестнадцати символов.
Наконец,
(?P<phone>\d{8})
Это должно проверить восьмизначный номер телефона.
Я немного нервничаю, что это точно не сработает - ваша версия RegEx может не поддерживать синтаксис именованной группы или синтаксис упреждающего просмотра, к которому я привык.
Я также немного нервничаю, что это регулярное выражение будет успешно соответствовать пустой строке. Различные версии Regex по-разному обрабатывают пустые строки.
Возможно, вы также захотите закрепить это регулярное выражение между ^ и $, чтобы убедиться, что вы соответствуете всей строке, а не только части большой строки.