регулярное выражение для имени и фамилии - PullRequest
103 голосов
/ 05 марта 2010

В целях проверки веб-сайта мне необходимо подтвердить имя и фамилию.

Для имени оно должно содержать только буквы и может состоять из нескольких слов с пробелами и без букв, как минимум из 3 символов и не более 30 символов.персонажи.Пустая строка не должна проверяться.Т.е.:

Джейсон, Джейсон, Джейсон Смит, Джейсон Смит, Джейсон, Джейсон Смит, Джейсон Смит, Джейсон Смит

Для фамилии это должно быть одно слово, только буквыне менее 3 символов и не более 30 символов.Пустая строка не должна проверяться.ИП: лазсло, лазсло, лазло

Ответы [ 19 ]

165 голосов
/ 05 марта 2010

Не забывайте о таких именах, как:

  • Матиас д'Аррас
  • Мартин Лютер Кинг, младший
  • Гектор Колбаса-Хаузен

Это должно сработать для большинства вещей:

/^[a-z ,.'-]+$/i

ИЛИ Поддержка международных имен с супер сладким Unicode:

/^[a-zA-ZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ∂ð ,.'-]+$/u

68 голосов
/ 05 марта 2010

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

20 голосов
/ 25 августа 2017

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

^[\w'\-,.][^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$

Поддерживаемые символы:

abcdefghijklmnopqrstwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
áéíóúäëïöüÄ'
陳大文
łŁőŐűŰZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųū
ÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁ
ŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ.-
ñÑâê都道府県Федерации
আবাসযোগ্য জমির걸쳐 있는
15 голосов
/ 24 апреля 2013

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

В моем случае это переменная $ name.

Я использовал следующий код для моего PHP:

    if (preg_match('/\b([A-Z]{1}[a-z]{1,30}[- ]{0,1}|[A-Z]{1}[- \']{1}[A-Z]{0,1}  
    [a-z]{1,30}[- ]{0,1}|[a-z]{1,2}[ -\']{1}[A-Z]{1}[a-z]{1,30}){2,5}/', $name)  
    # there is no space line break between in the above "if statement", any that   
    # you notice or perceive are only there for formatting purposes.  
    # 
    # pass - successful match - do something
    } else {
    # fail - unsuccessful match - do something

Я сам изучаю RegEx, но у меня есть объяснение кода, предоставленного приятелем RegEx.
Вот оно:

Утверждение позиции на границе слова «\ b»

Сопоставьте приведенное ниже регулярное выражение и запишите его соответствие в номер обратной ссылки 1
«([AZ] {1} [az] {1,30} [-] {0,1} | [AZ] {1} [- \ '] {1} [AZ] {0,1} [az] {1,30} [-] {0,1} | [az] {1,2} [- \ '] {1} [AZ] {1} [az] {1,30}) {2,5} »

От 2 до 5 раз, столько раз, сколько возможно, отдача по мере необходимости (жадный) «{2,5}»

* НУЖНА НЕКОТОРАЯ ПОМОЩЬ ЗДЕСЬ С ПОНИМАНИЕМ РАДИФИКАЦИЙ НАСТОЯЩЕГО ПРИМЕЧАНИЕ *

Примечание: я повторил саму группу захвата. Группа будет захватывать только последнюю итерацию. Поместите группу захвата вокруг повторяющейся группы, чтобы захватить все итерации. «{2,5}»

Соответствует любому регулярному выражению, указанному ниже (попытка следующей альтернативы, только если это не получится) «[A-Z] {1} [a-z] {1,30} [-] {0,1}»

Соответствует одному символу в диапазоне между «A» и «Z» «[A-Z] {1}»

Ровно 1 раз «{1}»

Соответствует одному символу в диапазоне между «a» и «z» «[a-z] {1,30}»

От одного до 30 раз, столько раз, сколько возможно, отдача по мере необходимости (жадный) «{1,30}»

Соответствует одному символу, присутствующему в списке «-» «[-] {0,1}»

От нуля до одного раза, столько раз, сколько возможно, возвращая по мере необходимости (жадный) «{0,1}»

Или соответствует регулярному выражению с номером 2, приведенному ниже (попытка использовать следующую альтернативу, только если эта попытка не удалась) «[AZ] {1} [- \ '] {1} [AZ] {0,1} [az] {1, 30} [-] {0,1} »

Соответствует одному символу в диапазоне между «A» и «Z» «[A-Z] {1}»

Ровно 1 раз «{1}»

Соответствует одному символу, представленному в списке ниже «[- \ '] {1}»

Ровно 1 раз «{1}»

Один из символов «-» «-» Символ «\» »

Соответствует одному символу в диапазоне между «A» и «Z» «[A-Z] {0,1}»

От нуля до одного раза, столько раз, сколько возможно, возвращая по мере необходимости (жадный) «{0,1}»

Соответствует одному символу в диапазоне между «a» и «z» «[a-z] {1,30}»

От одного до 30 раз, столько раз, сколько возможно, отдача по мере необходимости (жадный) «{1,30}»

Соответствует одному символу, присутствующему в списке «-» «[-] {0,1}»

От нуля до одного раза, столько раз, сколько возможно, возвращая по мере необходимости (жадный) «{0,1}»

Или соответствует регулярному выражению с номером 3 ниже (вся группа терпит неудачу, если эта группа не соответствует) «[az] {1,2} [- \ '] {1} [AZ] {1} [az] {1 , 30} »

Соответствует одному символу в диапазоне между «a» и «z» «[a-z] {1,2}»

От одного до 2 раз, столько раз, сколько возможно, отдача по мере необходимости (жадный) «{1,2}»

Соответствует одному символу в диапазоне между «» и «'» «[- \'] {1}»

Ровно 1 раз «{1}»

Соответствует одному символу в диапазоне между «A» и «Z» «[A-Z] {1}»

Ровно 1 раз «{1}»

Соответствует одному символу в диапазоне между «a» и «z» «[a-z] {1,30}»

От одного до 30 раз, столько раз, сколько возможно, отдача по мере необходимости (жадный) «{1,30}»

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

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

  1. Стив Смит (ошибка)
  2. Stev3 Smith (ошибка)
  3. STeve Smith (ошибка)
  4. Стив Смит (сбой)
  5. Стив См1 (передан Стиву См)
  6. d'Are to Beaware (передано в Are Beaware)
  7. Джо Блоу (прошло)
  8. Hyoung Kyoung Wu (прошло)
  9. Майк О'Нил (пройдено)
  10. Стив Джонсон-Смит (прошел)
  11. Йозеф-Шмозев Гимдел (пройдено)
  12. О Генри Смит (прошло)
  13. Матаис д'Аррас (пройдено)
  14. Мартин Лютер Кинг-младший (пройдено)
  15. Даунтаун-Джеймс Браун (пройдено)
  16. Даррен Маккарти (пройдено)
  17. Джордж Де ФанкМастер (пройдено)
  18. Баскетбольный мяч Kurtis B-Ball (пройден)
  19. Ахмад эль-Джеффе (прошло)

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

Если у вас есть какие-либо улучшения, пожалуйста, дайте мне знать. Я только на ранних стадиях (первые несколько месяцев работы над RegEx.

Спасибо и удачи, Стив

13 голосов
/ 15 октября 2016

Добрый день Всем.

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

Я пробовал эти типы имен и нашел идеальный вариант работы

1) Джон Смит
2) Джон Д'Ларги
3) Джон Доу-Смит
4) Джон Доу Смит
5) Гектор Колбаса-Хаузен
6) Матиас д'Аррас
7) Мартин Лютер Кинг
8) Ай Вонг
9) Чао Чанг
10) Альзбета Бара

Мой RegEx выглядит так:

^([a-zA-Z]{2,}\s[a-zA-z]{1,}'?-?[a-zA-Z]{2,}\s?([a-zA-Z]{1,})?)

Модель MVC4:

[RegularExpression("^([a-zA-Z]{2,}\\s[a-zA-z]{1,}'?-?[a-zA-Z]{2,}\\s?([a-zA-Z]{1,})?)", ErrorMessage = "Valid Charactors include (A-Z) (a-z) (' space -)") ]

Обратите внимание на двойные \ спасательные символы

Для тех из вас, кто не знаком с RegEx, я решил добавить объяснение.
^ (начало строки)
[a-zA-Z] {2,} (будет за исключением имени, содержащего не менее двух символов)
\ s (будет искать пробел между именем и фамилией)
[a-zA-Z] {1,} (требуется не менее 1 символа)
'? -? (возможно ' или - для двойных фамилий и переносов)
[a-zA-Z] {2,} (будет за исключением имени, содержащего не менее двух символов)
\ s? (возможен другой пробел)
([a-zA-Z] {1,})? * (возможна вторая фамилия) <* br />

Надеюсь, это поможет в ваших проектах.
С наилучшими пожеланиями
Франсуа Мюллер

10 голосов
/ 05 марта 2010

Имя будет

"([a-zA-Z]{3,30}\s*)+"

Если вам нужно, чтобы вся часть имени была короче, чем 30 букв, я думаю, вы должны проверить это отдельно. Выражение ".{3,30}" должно сделать это.

Ваши требования к фамилии будут переведены в

"[a-zA-Z]{3,30}"

но вы должны проверить это. Есть много фамилий, содержащих пробелы.

7 голосов
/ 11 сентября 2015

Как сказал Мачек:

Не забудьте о таких именах, как:

Матиас д'Аррас

Мартин Лютер Кинг,Jr.

Гектор Соссаж-Хаузен

и для удаления таких случаев, как:

.. Матиас

Martin King, Jr .-

Это будет охватывать больше случаев:

^([a-z]+[,.]?[ ]?|[a-z]+['-]?)+$
5 голосов
/ 30 августа 2017

Я работаю над приложением, которое проверяет международные паспорта (ИКАО). Мы поддерживаем только английские символы. Хотя большинство иностранных национальных символов может быть представлено символом латинского алфавита, например, например, есть несколько национальных символов, которым для их обозначения требуется дополнительная буква, например, немецкий умлаут, который требует, чтобы к букве было добавлено «е», например ä by ae.

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

/^[a-zA-Z '.-]*$/

Максимальное количество символов в загранпаспорте - до 31 . Мы используем maxlength = "31", чтобы лучше составлять сообщения об ошибках, а не включать их в регулярное выражение.

Вот фрагмент из нашего кода в AngularJS 1.6 с формой и обработкой ошибок:

class PassportController {
  constructor() {
    this.details = {};
    // English letters, spaces and the following symbols ' - . are allowed
    // Max length determined by ng-maxlength for better error messaging
    this.nameRegex = /^[a-zA-Z '.-]*$/;
  }
}

angular.module('akyc', ['ngMessages'])
  .controller('PassportController', PassportController);
 
.has-error p[ng-message] {
  color: #bc111e;
}

.tip {
  color: #535f67;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.6/angular.min.js"></script>
<script src="https://code.angularjs.org/1.6.6/angular-messages.min.js"></script>

<main ng-app="akyc" ng-controller="PassportController as $ctrl">
  <form name="$ctrl.form">

    <div name="lastName" ng-class="{ 'has-error': $ctrl.form.lastName.$invalid} ">
        <label for="pp-last-name">Surname</label>
        <div class="tip">Exactly as it appears on your passport</div>
        <div ng-messages="$ctrl.form.lastName.$error" ng-if="$ctrl.form.$submitted" id="last-name-error">
          <p ng-message="required">Please enter your last name</p>
          <p ng-message="maxlength">This field can be at most 31 characters long</p>
          <p ng-message="pattern">Only English letters, spaces and the following symbols ' - . are allowed</p>
        </div>
        
        <input type="text" id="pp-last-name" ng-model="$ctrl.details.lastName" name="lastName"
               class="form-control" required ng-pattern="$ctrl.nameRegex" ng-maxlength="31" aria-describedby="last-name-error" />
      </div>

      <button type="submit" class="btn btn-primary">Test</button>

  </form>
</main>
5 голосов
/ 21 августа 2014

Для простоты вы можете использовать:

(.*)\s(.*)

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

3 голосов
/ 25 июня 2013

Я использую:

/^(?:[\u00c0-\u01ffa-zA-Z'-]){2,}(?:\s[\u00c0-\u01ffa-zA-Z'-]{2,})+$/i

И проверка на максимальную длину с использованием других средств

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