Регулярное выражение для ФИО

512
04 февраля 2017, 06:57

Нужно регулярное выражение где в имени первая буква должна быть большой и другие большие буквы нужно запретить, за исключением случая когда имя пишется через дефис, тогда разрешается большая буква первая и которая идет сразу после дефиса, остальные нельзя. Например

Дмитрий - ОК

ДмИтрий - Ошибка

Дмитрий-Иосиф - ОК

ДмИтрий-Иосиф - Ошибка

Дмитрий-иосиф - Ошибка

Получилась регулярка у меня, только допускающая одну большую вначале, но через дефис имя уже воспринимает неправильно т.к. после дефиса идет еще одна большая.

Мое выражение

@"^[А-ЯЁ][а-яё\-]+\s([А-ЯЁ][а-яё\-]+)(\.|\s)\s*([А-ЯЁ][а-яё\-\.]+)$"

В нем используется шаблон Ф И О

Answer 1

Используйте

^\p{Lu}\p{Ll}*(?:-\p{Lu}\p{Ll}*)?$

См. демо регулярного выражения.

Подробности:

  • ^ - начало строки
  • \p{Lu} - заглавная буква
  • \p{Ll}* - 0 и более строчных букв
  • (?:-\p{Lu}\p{Ll}*)? - необязательная последовательность следующих шаблонов:
    • - - дефис
    • \p{Lu} - заглавная буква
    • \p{Ll}* - 0 и более строчных букв
  • $ - конец строки.

Если нужна поддержка только русских букв, замените

\p{Lu} --> [А-ЯЁ]
\p{Ll} --> [а-яё]
READ ALSO
Кэширование объектов с учетом их полей

Кэширование объектов с учетом их полей

Есть объекты, которые предоставляют данные для постройки графикаНужно построить механизм кэширования этих объектов, но не простой а с некоторой...

354
EntityFramework 6 и DB2

EntityFramework 6 и DB2

При выводе списка в представлении происходит ошибка Поле не найдено: "DB2ConnSettings_bEnableEFCaseSensitivity"

461
PHPUNIT возвращает неверный результат в теста

PHPUNIT возвращает неверный результат в теста

Например есть функция логина:

430