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

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

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

Для фамилии это должно быть одно слово, только буквы, не менее 3 символов, но не более 30 символов. Пустая строка не должна проверяться (например, lazslo, Lazslo, LAZSLO).

Ответ 1

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

  • Матиас д'Аррас
  • Мартин Лютер Кинг, младший.
  • Hector Sausage-Hausen

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Сопоставьте один символ в диапазоне между "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}"

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

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

Точно 1 раз "{1}"

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

Точно 1 раз "{1}"

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

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

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

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

  • STEVE SMITH (сбой)
  • Stev3 Smith (сбой)
  • STeve Smith (fail)
  • Стив Смит (не работает)
  • Стив Sm1th (передан Стив Смит)
  • d'Are to Beaware (передано на The Beaware)
  • Jo Blow (прошло)
  • Hyoung Kyoung Wu (прошло)
  • Майк О'Нил (прошел)
  • Стив Джонсон-Смит (прошел)
  • Йозеф-Шможев Хеймдел (прошел)
  • О Генри Смит (прошло)
  • Mathais d'Arras (прошло)
  • Мартин Лютер Кинг младший (прошел)
  • Центр города-Джеймс Браун (прошел)
  • Даррен Маккарти (прошел)
  • George De FunkMaster (прошло)
  • Баскетбол Kurtis B-Ball (прошел)
  • Ахмад эль-Джеффе (прошел)

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

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

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

Ответ 5

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

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

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

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

Мой 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/" >

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

Ответ 6

Имя будет

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

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

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

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

но вы должны их проверить. Существует множество имен, содержащих пробелы.

Ответ 7

Как сказал maček:

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

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

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

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

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

.. Матиас

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

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

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

Ответ 8

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

(.*)\s(.*)

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

Ответ 9

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

Это 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>

Ответ 10

Я использую:

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

И проверьте maxlength, используя другие средства

Ответ 11

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

Ответ 12

^\p{L}{2,}$

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

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

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

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

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

Ответ 13

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

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

Ответ 14

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

  • Длина
  • Содержание

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

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

1. Длина

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

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

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

Ответ 15

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

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

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

Ответ 16

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

JavaScript:

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

HTML5:

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

Ответ 17

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; 
} 

Ответ 18

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

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

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

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

Ответ 19

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