Regexp для имени

Мне нужно удостовериться, что люди правильно ввели свои первые, средние и фамильные имена для формы в Rails. Итак, первая мысль для регулярного выражения:

\A[[:upper:]][[:alpha:]'-]+( [[:upper:]][[:alpha:]'-]*)*\z

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

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

Мой второй вопрос заключается в том, важно ли удостовериться, что каждое имя имеет по крайней мере 1 прописную букву? Так много людей вводят все строчные имена, и я действительно хочу этого избежать, но иногда ли это законно?

Вот то, что у меня есть до сих пор, чтобы в нем было как минимум 1 буква в верхнем регистре:

\A([[:alpha:]'-]+ )*[[:alpha:]'-]*[[:upper:]][[:alpha:]'-]*( [[:alpha:]'-]+)*\z

Нет ли выражения скобки [: name:]?:)

ОБНОВЛЕНИЕ: я добавил . и , к допустимым символам, удивленный, что я не думал об этом изначально. Так много людей должны иметь дело с таким регулярным выражением! Никто не имеет каких-либо готовых регулярных выражений для такого рода вещей?

Ответ 1

Хорошим началом было бы позволить письма, знаки, пункции и пробелы. Чтобы разрешить данное имя, например, "Мария-Хосе" и фамилия "van Rossum" (обратите внимание на пробелы). Так что сводится к чему-то вроде:

[\p{Letter}\p{Mark}\p{Punctuation}\p{Separator}]+

Если вы хотите немного ограничить это, вы могли бы взглянуть на такие классы, как \p{Lowercase_Letter}, \p{Uppercase_Letter}, \p{Titlecase_Letter}, но могут быть сценарии, которые не имеют обсадной колонны. \p{Space_Separator} и \p{Dash_Punctuation} могут сузить его до имен, которые я знаю. Но имен я не... Я не знаю...

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

Например:

В некоторых культурах вам дается имя (Бьорк, Осама) и указание того, кем был ваш отец (или мать) (Гудмундсдоттир, бин Мохаммед). Таким образом, "имя" может быть "Björk", но:

Бьорк обычно не рассчитывал называться г-жа Гудмундсдоттир. Телефонные справочники в Исландии сортируются по указанному имени.

Но в других культурах имя не дано, а фамилия. В "Zhāng Mànyù" "Zhāng" - это фамилия. И как обращаться с ней, будет зависеть, насколько хорошо вы ее знаете, но опять же "Мисс Жанг" была бы странной.

Список примеров продолжается и заканчивается более чем 30 ссылками на Википедию для получения дополнительных примеров.

В статье заканчиваются предложения по полевому дизайну и некоторые указатели на то, какие символы разрешить:

Не забудьте позволить людям использовать знаки препинания, такие как дефисы, апострофы и т.д. в именах. Не требуйте ввода имен в верхнем регистре - это может быть затруднено на мобильном устройстве. Разрешить пользователю вводить имя с пробелами, например. для поддержки префиксов и суффиксов, таких как de на французском языке, на немецком языке и Jnr/Jr в американских именах, а также потому, что некоторые люди считают, что последовательность символов, разделенных пробелами, является единственным именем, например. Роза Мари.

Ответ 2

Чтобы ответить на ваш вопрос о заглавных буквах: во многих районах мира имена не обязательно начинаются с заглавной буквы. Например, на голландском языке у вас есть такие фамилии, как "van der Vliet", где слова "van", "de", "den" и "der" не капитализируются. Кроме того, у вас есть специальные случаи, такие как "De fauw" и "Van pellicom", где административная ошибка никогда не исправлялась, а правильная капитализация довольно нелогична. Пожалуйста, не делайте ошибку, отклоняя такие имена.

Я также знаю о названиях городов в Южной Африке, таких как eThekwini, где заглавная буква не обязательно является первой буквой слова. Это может очень хорошо отображаться в фамилиях или именах.