Просто начал изучать «чудеса» регулярного выражения. Будучи тем, кто учится на проб и ошибок, я действительно борется, потому что мои испытания вызывают непропорциональное количество ошибок … Мои эксперименты на PHP с использованием ereg ().
Так или иначе. Я работаю с именами и фамилиями отдельно, но теперь использую одно и то же регулярное выражение. Пока у меня есть:
^[AZ][a-zA-Z]+$
Любая строка длины, начинающаяся с капитала и имеющая только буквы (столица или нет) для остальных. Но там, где я разваливаюсь, речь идет о особых ситуациях, которые могут произойти в любом месте.
Может быть, есть и другое имя, о котором я не думаю, но я подозреваю, могу ли я придумать это, я могу добавить к нему. Я уверен, что будут случаи, когда более одного из этих ситуаций возникает в одном имени.
Итак, я думаю, что в нижней строке должно быть, чтобы мое регулярное выражение также принимало пробел, дефисы, амперсанды и апострофы, но не в начале или в конце имени, чтобы быть технически корректным.
Добавьте a – во второй класс символов. Самый простой способ сделать это – добавить его в начале, чтобы его нельзя было интерпретировать как модификатор диапазона (как в az
).
^ [AZ] [- A-Za-Z] + $
Наивный способ сделать это будет таким, как указано выше, давая:
^ [AZ] [- 'A-Za-Z] + $
Не забывайте, что вам может понадобиться избежать этого внутри строки! «Лучше», учитывая ваш пример:
^ [AZ]? [- A-Za-Z] + $
Это позволит сделать возможный одиночный апостроф во второй позиции.
Здесь у меня возникнет соблазн просто повторить наш наивный путь:
^ [AZ] '? [- a-zA-Z] + $
Потенциально лучший способ может быть:
^ [AZ] '? [- a-zA-Z] ([a-zA-Z]) * $
Который ищет дополнительные слова в конце. Вероятно, это не очень хорошая идея, если вы пытаетесь сопоставить имена в тексте дополнительного текста, но опять же, оригинал тоже не сделал бы этого.
На данный момент вы больше не смотрите на имена?
Во всяком случае, как вы можете видеть, регулярные выражения имеют привычку расти очень быстро …
Это регулярное выражение идеально для меня.
^([ \u00c0-\u01ffa-zA-Z'\-])+$
Он отлично работает в среде php, используя preg_match (), но не работает повсеместно.
Он соответствует Jérémie O'Co-nor
поэтому я думаю, что он соответствует всем именам UTF-8.
ВЫРАЖЕНИЕ ЛУЧШИХ РЕГЕБОВ ДЛЯ ИМЕНЕМ:
Обязательное одно имя, БЕЗ пробелов, БЕЗ специальных символов:
^([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: Если у вас есть вопросы, комментарии здесь, и я получу электронное письмо и ответю;)
Хотя я согласен с ответами, говорящими, что вы в основном не можете делать это с помощью регулярного выражения, я укажу, что некоторые из возражений (интернационализированные символы) могут быть разрешены с использованием строк UTF и класса символов \p{L}
(соответствует юникоду "письмо").
Мне не нужно много добавлять в регулярное выражение, которое заботится о именах, потому что здесь есть несколько хороших предложений, но если вы хотите немного ресурсов для получения более подробных сведений о регулярных выражениях, вы должны проверить:
Я второй совет «отказаться». Даже если вы рассматриваете числа, дефисы, апострофы и т. Д., Что-то вроде [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] +) *) $ /
Хорошего дня !
вы можете использовать это ниже для имен
^[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».