Подтвердить что ты не робот

Regex для имен

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

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

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

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

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

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

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

4b9b3361

Ответ 1

  • Перефилированные имена (Worthington-Smythe)

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

^[A-Z][-a-zA-Z]+$
  • Имена с апостофами (D'Angelo)

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

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

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

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

Это позволит сделать возможный одиночный апостроф во второй позиции.

  • Имена с пробелами (Ван дер Хэмптон) - столики в середине, которые могут потребоваться или не быть требуемыми, намного превосходят мои интересы на этом этапе.

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

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

Возможно, лучший способ:

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

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

  • Совлокальные имена (Бен и Джерри)

На данный момент вы больше не смотрите на одиночные имена?

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

Ответ 2

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

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

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

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

Ответ 3

ВЫРАЖЕНИЕ ЛУЧШИХ РЕГЕСТОВ ДЛЯ ИМЕН:

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

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

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

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

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

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

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

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

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

СПЕЦИАЛЬНЫЙ СЛУЧАЙ

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

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

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

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

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

(\'|\-|\.)

Для

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

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

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

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

jean-claude van damme

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

wayne la pierre

beverly d'angelo

billy-bob thornton

tito puente

susan del rio

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

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

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

Ответ 9

^[A-Z][a-zA-Z '&-]*[A-Za-z]$ 

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

Ответ 10

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

regex, чтобы соответствовать максимум 4 пробелам

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

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

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

Ответ 11

Чтобы улучшить ответ daan:

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

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

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

Ответ 12

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

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

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

Ответ 13

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

Ответ 14

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

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

Ответ 15

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

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

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

Ответ 16

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

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

Ответ 17

Я использовал это, потому что имя может быть частью файла-патча.

//http://support.microsoft.com/kb/177506
foreach(array('/','\\',':','*','?','<','>','|') as $char)
  if(strpos($name,$char)!==false)
      die("Not allowed char: '$char'");

Ответ 18

Я думаю: "/^ [a-zA-Z '] + $/" недостаточно, это позволит пропускать одну букву, мы можем отрегулировать диапазон, добавив {4,20}, что означает, что диапазон букв равен 4 до 20.

Ответ 19

Я придумал шаблон RegEx для имен:

/^([a-zA-Z]+[\s'.]?)+\S$/

Это работает. Я думаю, вы тоже должны его использовать.

Он соответствует только именам или строкам, например:

р. Шакил О'Нил Армстронг Базз-Алдрин

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

John   Paul

Он не будет соответствовать строкам с конечными пробелами типа:

Джон Пол  

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

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

RegExr: Leanr, Build и Test RegEx

Ответ 20

  • Попробуйте следующее:
    /^([A-Z][a-z]([ ][a-z]+)([ '-]([&][ ])?[A-Z][a-z]+)*)$/
  • Демо: http://regexr.com/3bai1

Приятного дня!

Ответ 21

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

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

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

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

\s space

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

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


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

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

Ответ 23

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