Регулярное выражение для имени и фамилии

Для проверки сайта мне нужно проверить имя и фамилию.

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

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

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

28 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 />

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

Я перепробовал почти все на этой странице, затем решил изменить ответ, получивший наибольшее количество голосов, который в итоге сработал лучше всего. Просто соответствует всем языкам и включает .,-' символы.

Вот:

      /^[\p{L} ,.'-]+$/u

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

В моем случае это переменная $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}"

* Мне нужна помощь здесь с пониманием RAMIFICATIONS этой записки *

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

Подберите либо регулярное выражение, приведенное ниже (попытка использовать следующую альтернативу только в случае неудачи) "[AZ]{1}[az] {1,30} [-] {0,1}"

Совпадение одного символа в диапазоне между "A" и "Z" "[AZ] {1}"

Ровно 1 раз "{1}"

Совпадение одного символа в диапазоне между "a" и "z" "[az] {1,30}"

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

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

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

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

Совпадение одного символа в диапазоне между "A" и "Z" "[AZ] {1}"

Ровно 1 раз "{1}"

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

Ровно 1 раз "{1}"

Один из символов "-" "-" A "символ" \ ""

Совпадение одного символа в диапазоне между "A" и "Z" "[AZ] {0,1}"

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

Совпадение одного символа в диапазоне между "a" и "z" "[az] {1,30}"

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

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

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

Или сопоставьте приведенное ниже регулярное выражение № 3 (вся группа не будет выполнена, если эта группа не соответствует) "[az]{1,2}[ -\']{1}[AZ]{1}[az] {1,30} "

Совпадение одного символа в диапазоне между "a" и "z" "[az] {1,2}"

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

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

Ровно 1 раз "{1}"

Совпадение одного символа в диапазоне между "A" и "Z" "[AZ] {1}"

Ровно 1 раз "{1}"

Совпадение одного символа в диапазоне между "a" и "z" "[az] {1,30}"

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

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

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

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

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

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

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

Имя будет

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

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

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

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

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

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

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

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

Мартин Лютер Кинг младший.

Гектор Колбаса-Хаузен

и удалить такие случаи, как:

..Mathias

Мартин Кинг-младший

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

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

Это регулярное выражение работает для меня (использовалось в Angular 8):

([a-zA-Z',.-]+( [a-zA-Z',.-]+)*){2,30}

Он будет недействителен, если есть:-

  1. Любой пробел в начале или в конце имени
  2. Есть символы, например @
  3. Менее 2 или более 30

Пример неверного имени (пробел)

Пример действительного имени:

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

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

/^[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>

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

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

Окончательное регулярное выражение без знаков препинания: ["] ['] [,] [.] и т. д.:

      ^([^\p{N}\p{S}\p{C}\p{P}]{2,20})$

со знаками препинания:

      ^([^\p{N}\p{S}\p{C}\\\/]{2,20})$

При этом все эти имена действительны:

      alex junior
沐宸
Nick
Sarah's Jane ---> with punctuation support
ביממה
حقیقت
Виктория

И следующие имена становятся недействительными:

       Maria
k
١١١١١
123John

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

Чтобы получить дополнительную информацию о доступных шаблонах для включения/исключения проверки, выполните следующие действия:https://www.regular-expressions.info/unicode.html#prop .

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

^[A-Z][a-z]*(([,.] |[ '-])([A-Z][a-z]*|[a-z]+))*[.]?$ Попробуйте на каком-нибудь онлайн-сайте, например regex101 или что-то еще.

  • Первый символ должен быть заглавным.
  • Кроме того, я предположил, что Z - допустимое имя, противоречащее общему предположению, сделанному в этом потоке, но вы можете легко изменить это регулярное выражение.
  • Пробелы в начале и в конце не допускаются
  • regex требует НЕ оставлять поле ввода пустым, следовательно, пустая строка недействительна.
  • Поддерживает только английский алфавит
  • Поддерживает дефисы ( Some-Foobarbaz-name, Some foobarbaz-Name), апостроф ( David D'Costa, David d'costa), периоды ( Robert Downey Jr., Ar. Gen) и запятая.

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

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

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

Пробелы используются только как допустимое имя!

На мой взгляд, лучшее решение - добавить в начало негативный взгляд на будущее:

^(?!\s)([a-z ,.'-]+)$/i

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

(.*)\s(.*)

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

Я использую:

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

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

Самый простой способ. Просто проверьте почти 2 слова.

/^[^\s]+( [^\s]+)+$/

Действительные имена

  • Джон Доу
  • Педро Альберто Ч
  • Ar. Gen
  • Матиас д'Аррас
  • Мартин Лютер Кинг младший.

Нет действительных имен

  • Джон
  • 陳大文

Это то, что я использую. Это регулярное выражение принимает только имена с минимальным количеством символов, от A-Z a-z ,space and -,

Пример имен: Ionut Ionete, Ionut-Ionete Cantemir, Ionete Ionut-Cantemirm Ionut-Cantemir Ionete-Second

Максимальное количество символов имени - 3, если вы хотите создать это изменение, измените {3,} на {6,}

([a-zA-Z\-]+){3,}\s+([a-zA-Z\-]+){3,}
^\p{L}{2,}$

^ устанавливает позицию в начале строки.

\ p {L} соответствует любому виду букв любого языка

{2,} Quantifier - Сопоставляет от 2 до неограниченного количества раз, столько раз, сколько возможно, возвращая при необходимости (жадный)

$ утверждает позицию в конце строки

Таким образом, это должно быть имя на любом языке, содержащее как минимум 2 буквы (или символы) без цифр или других символов.

Для имен и фамилий есть только две вещи, которые вы должны искать:

  1. длина
  2. содержание

Вот мое регулярное выражение:

var regex = /^[A-Za-z-,][3,20‹?=.*\d)/

1. Длина

Здесь {3,20} ограничивает длину строки от 3 до 20 символов.

2. Содержание

Информация в квадратных скобках [A-Za-z] допускает использование прописных и строчных букв. Все последующие символы (-,.) также допускаются.

Итак, с клиентом мы создаем это сумасшедшее регулярное выражение:

(^$)|(^([^\-!#\$%&\(\)\*,\./:;\?@\[\\\]_\{\|\}¨ˇ“”€\+<=>§°\d\s¤®™©]| )+$)

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

JavaScript:

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

HTML5:

<input type="text" name="full_name" id="full_name" pattern="^(?:((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-.\s])){1,}(['’,\-\.]){0,1}){2,}(([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-. ]))*(([ ]+){0,1}(((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-\.\s])){1,})(['’\-,\.]){0,1}){2,}((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-\.\s])){2,})?)*)$" required>

Следующее выражение будет работать на любом языке, поддерживаемом UTF-16, и обеспечит наличие как минимум двух компонентов имени (т. Е. First + last), но также разрешит любое количество отчеств.

/^(\S+ )+\S+$/u

На момент написания этой статьи кажется, что ни один из других ответов не отвечает всем этим критериям. Четное ^\p{L}{2,}$, который является ближайшим, не дотягивает, потому что он также будет соответствовать "невидимым" символам, таким как U+FEFF Пространство без перерывов нулевой ширины.

Кажется, это работает для меня:

[\S]{2,} [\S]{2,}( [\S]{2,})*

Я обычно пишу:

      return /^[a-zA-Z\-\s\.\'\`\u00E0-\u00FC]+$/.test(firstName);

Полное имя с одним пробелом:

^[a-zA-Z'\-\pL]+(?:(?! {2})[a-zA-Z'\-\pL ])*[a-zA-Z'\-\pL]+$

Простая функция, использующая preg_match в php

<?php
function name_validation($name) {
    if (!preg_match("/^[a-zA-Z ]*$/", $name) === false) {
        echo "$name is a valid name";
    } else {
        echo "$name is not a valid name";
    }
}

//Test
name_validation('89name');
?>
var name = document.getElementById('login_name').value; 
if ( name.length < 4  && name.length > 30 )
{
    alert ( 'Name length is mismatch ' ) ;
} 


var pattern = new RegExp("^[a-z\.0-9 ]+$");
var return_value = var pattern.exec(name);
if ( return_value == null )
{
    alert ( "Please give valid Name");
    return false; 
} 

Если вы хотите, чтобы полное имя было длиной от 3 до 30 символов без ограничений на отдельные слова, попробуйте следующее:

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

Помните, что он исключает все иностранные буквы как é,è,à,ï.

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

Другие вопросы по тегам