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


126

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

Имя должно содержать только буквы, может состоять из нескольких слов с пробелами и содержать не менее трех символов, но не более 30 символов. Пустая строка не должна быть подтверждена (например , Джейсон , Ясон , Джейсон Смит , Джейсон Смит , Джейсон , Джейсон Смит , Джейсон Смит и Джейсон Смит ).

Фамилия должна состоять из одного слова, только букв, не менее трех, но не более 30 символов. Пустые строки не должны проверяться (например, lazslo , Lazslo и LAZSLO ).


10
А как насчет таких имен, как «Джо»?
2010,

6
просто замечание: дефисы часто встречаются в фамилиях ... может быть, есть и фамилии с пробелами,
tanascius 05

2
Примечание: регулярное выражение-валидатор будет игнорировать пустые входные данные: это может быть, а может и не быть тем, что вы хотите.
Ханс Кеинг

4
Если это вообще возможно, если у вас нет убедительной причины требовать имя и фамилию, просто укажите одно поле «Имя». kalzumeus.com/2010/06/17/…
Крис

1
или что насчет "X Æ A-12" twitter.com/elonmusk/status/1257508900812713984
Риши Дуа

Ответы:


196

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

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

Это должно помочь в большинстве случаев:

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

ИЛИ Поддержка международных имен с помощью супер-сладкого юникода:

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


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

31
Вы не можете проверить все возможные национальные символы. Например őŐűŰ, отсутствуют венгерские символы , также польские символы łŁ, не говоря уже о ряде литовских и латышских символов. Скорее попробуйте найти библиотеку, которая преобразует экзотические символы в правильную версию без акцента, а затем напишите /^[a-z ,.'-]+$/iрегулярное выражение.
gaborsch 02

70
Значит, 陳大文здесь неверное имя?
Элвин Вонг

16
Для Unicode используйте /^[\p{L}'][ \p{L}'-]*[\p{L}]$/u, но довольно щадящий.
Фредерик Краутвальд

4
Не нужно включать AZ в исходный пример, потому что модификатор i после выражения означает игнорирование регистра.
mhanney

74

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


должен был быть комментарий.
Dementic

32

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

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

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

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

2
Из всех ответов этот сработал как шарм с использованием ng 4.
Денисс М.

1
Ваше регулярное выражение не работает в строке из 2 символов. Я думаю, что это исправило^[\w'\-,.]*[^_!¡?÷?¿\/\\+=@#$%ˆ&*(){}|~<>;:[\]]*$
TKA

Поддерживаются национальные символы, но не на первой позиции. Я бы сменил выражение на^[^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$
TOUDIdel

18

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

Я пробовал эти типы имен и нашел, что они отлично работают

  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 -)") ]

Обратите внимание на двойное значение \\для escape-символов

Для тех из вас, кто плохо знаком с RegEx, я подумал, что добавлю объяснение.

^               // start of line
[a-zA-Z]{2,}    // will except a name with at least two characters
\s              // will look for white space between name and surname
[a-zA-Z]{1,}    // needs at least 1 Character
\'?-?           // possibility of **'** or **-** for double barreled and hyphenated surnames
[a-zA-Z]{2,}    // will except a name with at least two characters
\s?             // possibility of another whitespace
([a-zA-Z]{1,})? // possibility of a second surname

У меня есть модульный тест, который проверяет несколько имен, а затем несколько вещей, которые не являются именами. В списке not names первой записью является «тестовый токен». Это соответствует этому.
Роб

Это почти то, что я искал. Я предполагаю (может быть, ошибочно), что вы француз. И один случай - это не ручка, с которой вы можете столкнуться во французском: составные имена, такие как Жан-Пьер, Мари-Шарлотта и т.д ... Я новичок в reg exp, но я думаю, что -? Как и в случае с фамилией, между двумя первыми словами может работать.
Linpter

Привет, Linpter, не француз, но у меня есть французское имя. Да. Я не тестировал это, однако вы должны иметь возможность добавить - в первый [], поэтому измените: ^ ([a-zA-Z] {2,} \ s [a-zA-z] {1,} ' ? -? [a-zA-Z] {2,} \ s? ([a-zA-Z] {1,})?) TO: ^ ([a-zA-Z -] {2,} \ s [a-zA-z] {1,} '? -? [a-zA-Z] {2,} \ s? ([a-zA-Z] {1,})?)
Франсуа Мюллер

16

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

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

Сопоставьте любое из приведенных ниже регулярных выражений (попытка следующей альтернативы только в случае неудачи) «[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}»

От одного до двух раз, как можно больше раз, отдавая по мере необходимости (жадно) «{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. d'Are to Beaware (передано в Are to Beaware)
  7. Джо Блоу (пройдено)
  8. Хён Кён У (сдано)
  9. Майк О'Нил (прошел)
  10. Стив Джонсон-Смит (пас)
  11. Йозеф-Шмозев Гимдель (сдан)
  12. О Генри Смит (пройден)
  13. Матаис д'Аррас (прошел)
  14. Мартин Лютер Кинг младший (прошел)
  15. Центр города-Джеймс Браун (пройден)
  16. Даррен Маккарти (прошел)
  17. Джордж Де ФанкМастер (сдано)
  18. Kurtis B-Ball Basketball (пас)
  19. Ахмад эль Джефф (прошел)

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

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

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


1
Подойдут ли с этим такие вещи, как «Четвертый» или «IV»?
majidarif

11

Имя будет

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

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

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

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

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


Проверяет ли это пробелы между?
Y_Y 02

2
А что насчет О'Коннора ? Апостроф тоже нужно включить.
spaceman

1
Довольно неполно. Имя может быть «Жан-Клод» с дефисом. Фамилия может быть "Д'арк" с цитатой. К тому же, что, если «Франсуа» - это имя?
Барт

1
А что насчет "Ала"? Действительное имя. Всего две буквы. А как насчет китайских, русских, хинди имен? А европейские имена?
Christian Hujer

это не сработает для многих неанглийских или (нелатинских?) имен
oldboy

7

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

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

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

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

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

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

..Mathias

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

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

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

Если я хочу ограничить длину своего символа, то какой для этого может быть код?
Абхисек 01

1
Да, Мартин Лютер Кинг-младший возвращается, как и король Генрих Восьмой.
Стив Кинзи

7

Я работаю над приложением, которое проверяет международные паспорта (ИКАО). Мы поддерживаем только английские символы. Хотя большинство иностранных национальных символов могут быть представлены символом латинского алфавита, например è через e, есть несколько национальных символов, которые требуют дополнительной буквы для их представления, например, немецкий умляут, который требует добавления 'e' к букве. например ä пользователя 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>


@danieltakeshi, ты не использовал мое регулярное выражение. Используйте это: / ^ [a-zA-Z '.-] * $ /
Александр Буракевич

5

Я использую:

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

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


5

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

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

введите описание изображения здесь

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

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

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

введите описание изображения здесь

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

введите описание изображения здесь


6
А как насчет Бьорк Гудмундсдоттир?
Мариуш Ямро,

4

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

(.*)\s(.*)

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


2
^\p{L}{2,}$

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

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

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

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

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


имейте в виду, что некоторые символы, такие как 'и -, допустимы в именах.
Mathijs Segers

1

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

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

1

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

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

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

var regex = /^[A-Za-z-,pting{3,20}?=.*\d)/

1. Длина

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

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

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


1

Это то, что я использую.

Это регулярное выражение принимает только имена с минимальным количеством символов от 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,}

2
А как насчет ä å ö Ä Å Ö и т. Д.? Очень часто встречается в шведских именах. Фамилия О'Коннер также не удастся, и двуствольные имена также дадут проблемы. Это будет очень неприятно для людей с такими допустимыми именами.
Уилт

А как насчет апострофа в таких именах, как О'Коннор?
Fogmeister

мое выражение возвращает Майкл Джордан О'Рейли младший как допустимое имя
Стив Кинзи

0

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

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

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


не передает javascript для regexr.com 1) предупреждение: функция Unicode может поддерживаться не во всех браузерах. 2) также позволяет числа в регулярном выражении. Например: michael dimmittsasd2123123
Michael

0

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

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>



-1

Простая функция с использованием 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');
?>


-2

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

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

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

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


-2
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; 
} 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.