Regex для имен

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

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

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

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

  • Деффицированные имена (Worthington-Smythe)
  • Имена с апостофами (D'Angelo)
  • Имена с пробелами (Ван дер Хэмптон) – столики в середине, которые могут потребоваться или не быть требуемыми, – это мой взгляд на этот этап.
  • Совместные имена (Ben & Jerry)

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

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

Solutions Collecting From Web of "Regex для имен"

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

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

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

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

  ^ [AZ] [- 'A-Za-Z] + $ 

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

  ^ [AZ]? [- A-Za-Z] + $ 

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

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

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

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

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

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

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

  • Совместные имена (Ben & Jerry)

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

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

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

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

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

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

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

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

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

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

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

 ^[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: Если у вас есть вопросы, комментарии здесь, и я получу электронное письмо и ответю;)

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

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

  • Шрифт библиотеки Regex Library
  • Другой чит-лист
  • Учебное пособие по регулярному выражению на форумах DevNetwork: часть 1 и часть 2
  • Учебник PHP-строителя
  • И если вам когда-либо понадобится regex для JavaScript (это немного отличается от вкуса), попробуйте JavaScript Kit или этот ресурс или ссылку Mozilla

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

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

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

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

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

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

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

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

jean-claude van damme

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

Wayne la pierre

beverly d'angelo

billy-bob thornton

tito puente

сусан-дель-рио

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

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

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

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

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

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

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

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

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

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

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

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

разрешает только однократное появление дефиса или апострофии внутри az и действительных символов Unicode.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Джон Пол

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

Джон Пол

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

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

RegExr: Leanr, Build и Test RegEx

  • Попробуй это:
      / ^ ([AZ] [az] ([] [az] +) (['-] ([&] [])? [AZ] [az] +) *) $ / 
  • Демо: http://regexr.com/3bai1

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

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

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

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

$ end строки

\s пробел

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

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


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

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

Проверь это:

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

регулярное выражение

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

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