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

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

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

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

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

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

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

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

Ответы [ 23 ]

46 голосов
/ 12 января 2010

Это регулярное выражение идеально подходит для меня.

^([ \u00c0-\u01ffa-zA-Z'\-])+$

Он отлично работает в средах php с использованием preg_match (), но не везде.

Это соответствует Jérémie O'Co-nor, поэтому я думаю, что оно соответствует всем именам UTF-8.

40 голосов
/ 08 ноября 2008
  • Переносимые имена (Уортингтон-Смайт)

Добавьте a - во второй класс символов. Самый простой способ сделать это - добавить его в начале, чтобы его нельзя было интерпретировать как модификатор диапазона (как в a-z).

^[A-Z][-a-zA-Z]+$
  • Имена с апостофиями (д'Анжело)

Наивный способ сделать это будет таким же, как указано выше:

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

Не забывайте, что вам может понадобиться убежать из строки! «Лучший» способ, учитывая ваш пример:

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

Что позволит допустить единственный апостроф во второй позиции.

  • Имена с пробелами (Van der Humpton) - заглавные буквы в середине, которые могут или не могут потребоваться, на данном этапе меня не интересуют.

Здесь я бы соблазнился просто сделать наш наивный путь снова:

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

Потенциально лучшим способом может быть:

^[A-Z]'?[- a-zA-Z]( [a-zA-Z])*$

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

  • Объединенные имена (Бен и Джерри)

В этот момент вы больше не смотрите на отдельные имена?

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

9 голосов
/ 22 июля 2015

ЛУЧШИЕ ВЫРАЖЕНИЯ РЕКЕКСА ДЛЯ ИМЕН:

  • Я буду использовать термин специальный символ для обозначения следующих трех символов:
    1. Тире -
    2. Дефис '
    3. Точка .
  • Пробелы и специальные символы не могут появляться дважды подряд (например: - или '. или .. )
  • Обрезается (без пробелов до или после)
  • Не за что;)

Обязательное одиночное имя, БЕЗ пробелов, БЕЗ специальных символов:

^([A-Za-z])+$
  • Сьерра действительна, Джек Александр недействителен (имеет пробел), О'Нил недействителен (имеет специальный символ)

Обязательное одно имя, БЕЗ пробелов, С специальные символы:

^[A-Za-z]+(((\'|\-|\.)?([A-Za-z])+))?$
  • Сьерра действительна, О'Нил действителен, Джек Александр недействителен (имеет пробел)

Обязательное одиночное имя, необязательные дополнительные имена , С пробелами, С специальные символы:

^[A-Za-z]+((\s)?((\'|\-|\.)?([A-Za-z])+))*$
  • Джек Александр действителен, Сьерра О'Нил действителен

Обязательное одиночное имя, необязательные дополнительные имена , С пробелами, БЕЗ специальные символы:

^[A-Za-z]+((\s)?([A-Za-z])+)*$
  • Джек Александр действителен, Сьерра О'Нил недействителен (имеет специальный символ)

ОСОБЫЙ СЛУЧАЙ

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

Обязательное одно имя + необязательные дополнительные имена + пробелы + специальные символы:

^(\s)*[A-Za-z]+((\s)?((\'|\-|\.)?([A-Za-z])+))*(\s)*$

Добавьте свои специальные символы

Если вы хотите добавить свои собственные специальные символы, скажем, подчеркивание _ это группа, которую вам нужно обновить:

(\'|\-|\.)

К

(\'|\-|\.|\_)

PS: Если у вас есть вопросы, прокомментируйте здесь, и я получу электронное письмо и отвечу;)

6 голосов
/ 09 ноября 2008

Хотя я согласен с ответами о том, что вы в принципе не можете сделать это с помощью регулярных выражений, я укажу, что некоторые возражения (интернационализированные символы) могут быть разрешены с помощью строк UTF и класса символов \p{L} (соответствует Юникод "буква").

5 голосов
/ 09 ноября 2008

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

4 голосов
/ 13 мая 2011

Это сработало для меня:

 +[a-z]{2,3} +[a-z]*|[\w'-]*

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

Жан-Клод Ван Дамм

Надин Арройо-Родрикес

Уэйн ла Пьер

Беверли д'Анджело

Билли-Боб Торнтон

Тито Пуэнте

Сьюзан-дель-Рио

Это будет группа "van damme", "arroyo-rodriquez", "d'angelo", "billy-bob" и т. Д., А также такие уникальные имена, как "wayne".

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

Я написал это для разбора имен для приложения MapReduce. Все, что я хотел, это извлечь слова из поля имени, сгруппировав del foo, la bar и billy-bobs в одно слово, чтобы повысить точность генерации пары ключ-значение.

4 голосов
/ 09 ноября 2008

Я второй совет «сдаться». Даже если вы учитываете числа, дефисы, апострофы и тому подобное, что-то вроде [a-zA-Z] все равно не поймает международные имена (например, те, которые имеют šđčćž, или кириллицу, или китайские символы ...)

Но ... почему вы даже пытаетесь проверить имена? Какие ошибки вы пытаетесь отловить? Не думаете ли вы, что люди знают, как написать свое имя лучше, чем вы? ;) Серьезно, единственное, что вы можете сделать, пытаясь проверить имена, - это раздражать людей необычными именами.

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

В принципе, я согласен с Полом ... Вы всегда найдете исключения, такие как ди Каприо , DeVil или подобные.

Замечания к вашему сообщению: в PHP ereg обычно считается устаревшим (медленным, неполным) в пользу preg (регулярные выражения PCRE).
И вам стоит попробовать тестер регулярных выражений, например, мощный Regex Coach : они отлично подходят для быстрой проверки RE на произвольные строки.

Если вам действительно нужно решить свою проблему и вы не удовлетворены приведенными выше ответами, просто спросите, я попрошу.

2 голосов
/ 19 сентября 2017

Проверьте это:

^(([A-Za-z]+[,.]?[ ]?|[a-z]+['-]?)+)$

regex

Вы можете проверить это здесь : https://regex101.com/r/mS9gD7/46

1 голос
/ 29 декабря 2010

Чтобы добавить несколько точек в имени пользователя, используйте это регулярное выражение:

^[a-zA-Z][a-zA-Z0-9_]*\.?[a-zA-Z0-9_\.]*$

Длина строки может быть установлена ​​отдельно.

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