Регулярное выражение для имен - PullRequest
23 голосов
/ 08 ноября 2008

Просто начинаю изучать «чудеса» регулярных выражений. Будучи человеком, который учится методом проб и ошибок, я действительно изо всех сил, потому что мои испытания приводят к непропорциональному количеству ошибок ... Мои эксперименты в PHP с использованием ereg ().

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

^[A-Z][a-zA-Z]+$  

Любая длина строки, которая начинается с заглавной буквы и имеет только буквы (заглавные или нет) для остальных. Но там, где я разваливаюсь, приходится сталкиваться с особыми ситуациями, которые могут случиться где угодно.

  • Переносимые имена (Уортингтон-Смайт)
  • Имена с апостофиями (д'Анжело)
  • Имена с пробелами (Ван-дер-Хэмптон) - прописные буквы в середине, которые могут или не могут потребоваться, далеко за пределами моего интереса на данном этапе.
  • Совместные имена (Бен и Джерри)

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

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

Ответы [ 23 ]

1 голос
/ 09 ноября 2008

См. Этот вопрос для более связанных вещей "обнаружения имени".

регулярное выражение для соответствия максимум 4 пробелам

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

Если вы все еще ограничиваете себя словами без ä ü æ ß и другими подобными символами, не являющимися строго ascii.

Получите себе копию таблицы символов UTF32 и поймите, сколько миллионов допустимых символов существует, что ваше простое регулярное выражение пропустит.

1 голос
/ 08 ноября 2008
^[A-Z][a-zA-Z '&-]*[A-Za-z]$ 

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

1 голос
/ 16 января 2012

/([\u00c0-\u01ffa-zA-Z'\-]+[ ]?[*]?[\u00c0-\u01ffa-zA-Z'\-]*)+/;

Попробуй это. Вы также можете принудительно начать с char, используя ^, и завершить с char, используя $

.
1 голос
/ 22 марта 2011

Вы можете легко нейтрализовать весь вопрос о том, являются ли буквы прописными или строчными - даже в неожиданных или необычных местах - преобразовав строку во все прописные буквы, используя strtoupper () и затем проверяет его по вашему регулярному выражению.

1 голос
/ 13 сентября 2014

Чтобы улучшить ответ Даана:

^([\u00c0-\u01ffa-zA-Z]+\b['\-]{0,1})+\b$

допускает только одно вхождение дефиса или апострофии в пределах a-z и допустимых символов Юникода.

также выполняет возврат, чтобы убедиться, что в конце строки нет дефисов и апострофов.

1 голос
/ 24 июля 2012

Я столкнулся с той же проблемой, и, как и многие другие, которые опубликовали, это не на 100% доказательство глупости, но оно работает для нас.

/([\-'a-z]+\s?){2,4}/

При этом будут проверяться любые дефисы и / или апострофы в имени и / или фамилии, а также проверяться пробел между именем и фамилией. Последняя часть представляет собой небольшую магию, которая проверяет от 2 до 4 имен. Если у вас, как правило, много международных пользователей, которые могут иметь 5 или даже 6 имен, вы можете изменить это значение на 5 или 6, и оно должно работать для вас.

0 голосов
/ 08 ноября 2008

если вы добавите пробелы, то "Он пошел на рынок в воскресенье" будет правильным именем.

Я не думаю, что вы можете сделать это с помощью регулярного выражения, вы не можете легко определить имена из фрагмента текста с помощью регулярного выражения, вам понадобится словарь утвержденных имен и поиск по ним. Любые имена, которых нет в списке, не будут обнаружены.

0 голосов
/ 17 сентября 2017

Вы можете использовать это ниже для имен

^[a-zA-Z'-]{3,}\s[a-zA-Z'-]{3,}$

^ начало строки

$ конец строки

\s пробел

[a-zA-Z'-\s]{3,} принимает любое имя длиной 3 или более символов, и оно включает имена с ' или -, такие как jean-luc

Так что в нашем случае он будет принимать имена только из 2 частей, разделенных пробелом


в случае нескольких имен вы можете добавить \s

^[a-zA-Z'-\s]{3,}\s[a-zA-Z'-]{3,}$
0 голосов
/ 08 ноября 2008

Сдайся. Каждое правило, о котором вы можете подумать, имеет исключения в той или иной культуре. Даже если эта «культура» - это выродки, которые по закону любят менять свои имена на «37eet».

0 голосов
/ 02 июля 2015
  • Попробуйте это:
    /^([A-Z][a-z]<em>([ ][a-z]+)</em>([ '-]([&][ ])?[A-Z][a-z]+)*)$/
  • Демо: http://regexr.com/3bai1

Хорошего дня!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...