Регулярне вираження імені та прізвища


124

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

Для імені воно повинно містити лише літери, може містити кілька слів із пробілами та має мінімум три символи, але максимум у верхній частині 30 символів. Порожню рядок не слід перевіряти (наприклад, Джейсон , Джейсон , Джейсон Сміт , Джейсон Сміт , Джесон , Джейсон Сміт , Джейсон Сміт та Джейсон Сміт ).

Для прізвища це повинно бути одне слово, лише букви, принаймні три символи, але не більше 30 символів. Порожні рядки не повинні бути перевірені (наприклад, lazslo , Lazslo та LAZSLO ).


10
Що з іменами на кшталт "Джо"?
a'r

6
лише зауваження: дефіси поширені в прізвищах ... можливо, і прізвища з пробілами теж
tanascius

2
Примітка: регулятор виправлення виразів ігнорує порожні входи: це може бути або не бути тим, що ви хочете.
Ганс Ке,

4
Якщо це взагалі можливо, якщо у вас немає дивовижної причини вимагати імені та прізвища, просто введіть одне поле "Ім'я". kalzumeus.com/2010/06/17/…
Кріс,

Відповіді:


195

Не забувайте про такі назви:

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

Це має зробити трюк для більшості речей:

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

АБО Підтримуйте міжнародні назви із супер солодким Unicode:

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


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

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

69
Тож чи 陳大文не справжнє ім’я тут?
Елвін Вонг

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

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

73

Ви робите помилкові припущення щодо формату імені та прізвища. Напевно, краще взагалі не підтверджувати ім’я, окрім перевірки, чи воно порожнє.


мав бути коментар.
Дементік

32

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

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

Підтримуються персонажі:

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

2
З усіх відповідей цей працював як шарм, використовуючи 4
Деніс М.

1
Не вдалося виконати регулярний вираз із двох символів. Я думаю, що це виправлено^[\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 -)") ]

Зверніть увагу на подвійний \\символ для втечі

Для тих із вас, хто не є новим у 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

У мене є одиничний тест, який тестує кілька імен, потім кілька речей, які не є іменами. У списку не імен є "тест-маркер" як перший запис. Це відповідає цьому.
Роб

Це майже те, що я шукав. Я здогадуюсь (можливо, неправильно), що ти - французький хлопець. І один випадок не є справою, з якою ви можете зіткнутися французькою мовою: складені імена, як Жан-П'єр, Марі-Шарлотта і т. Д ... Я новачок у reg exp, але я здогадуюсь -? як і ти за прізвищем, між двома першими словами, можна було зробити цю роботу.
Лінтер

Привіт Лінтер, не французький, однак у мене є французьке ім’я. Так. Я цього не перевіряв, однак ви повинні бути в змозі додати - у перший [] так змінити: ^ ([a-zA-Z] {2,} \ s [a-zA-z] {1,} ' ? -? [a-zA-Z] {2,} \ s? ([a-zA-Z] {1,})?) ДО: ^ ([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. Стів Sm1th (передано Стіву Sm)
  6. d'Are to Beaware (передається "Are to Beaware")
  7. Джо Удар (пройшов)
  8. Х'юн Кюн Ву (пройшов)
  9. Майк О'Ніл (пройшов)
  10. Стів Джонсон-Сміт (пройшов)
  11. Юзеф-Шмозев Хіемдель (пройшов)
  12. О Генрі Сміт (пройшов)
  13. Матайс д'Аррас (пройшов)
  14. Мартін Лютер Кінг-молодший (пройшов)
  15. Центр міста - Джеймс Браун (пройшов)
  16. Даррен Маккарті (пройшов)
  17. Джордж Де ФанкМастер (пройшов)
  18. Куртис B-Ball Баскетбол (пройшов)
  19. Ахмад ель Джефф (минув)

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

Якщо у вас є якісь вдосконалення, будь ласка, повідомте мене про це. Я просто на ранніх стадіях (перші кілька місяців з'ясування RegEx.

Дякую і удачі, Стів


1
Чи спрацювали б такі речі, як "Четвертий" чи "IV"?
майдариф

11

Прізвище було б

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

Якщо вам потрібно, щоб вся частина імені була коротшою, ніж 30 літер, я думаю, це потрібно перевірити окремо, я думаю. Вираз ".{3,30}"повинен це робити.

Ваші вимоги до прізвища перекладаються на

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

але ви повинні перевірити їх. Існує безліч прізвищ, що містять пробіли.


Чи перевіряє це пробіли між ними?
Y_Y

2
Що з О'Коннором ? Апостроф також повинен бути включений.
космонавт

1
Досить неповний. Перше ім’я могло бути "Жан-Клод" з дефісом. Прізвище може бути "D'arc" з цитатою. Плюс, що робити, якщо "Франсуа" ім'я?
барт

1
А як з "Аль"? Дійсне ім’я. Всього дві букви. Що з іменами китайського, російського, хінді? Що з європейськими іменами?
Крістіан Худжер

це не буде працювати для багатьох неанглійських чи (не латинських?) імен
oldboy

7

Як сказав Мачек:

Не забувайте про такі назви:

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

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

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

і видалити випадки, такі як:

..Матіас

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

Це охопить більше випадків:

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

Якщо я хочу обмежити довжину свого символу, то яким може бути код для цього?
Г.Абхісек

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

7

Я працюю над додатком, який підтверджує міжнародні паспорти (ICAO). Ми підтримуємо лише англійських символів. Хоча більшість іноземних національних символів можуть бути представлені символом латинського алфавіту, наприклад, è by 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>


@danieltakeshi ви не використовували мій Regex. Використовуйте це: / ^ [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
А як з "Björk Guðmundsdóttir"?
Маріуш Джамро

4

Для простоти ви можете використовувати:

(.*)\s(.*)

Мені подобається в тому, що прізвище завжди після імені, тому якщо ви збираєтеся ввести ці зібрані групи в базу даних, а ім'я - Джон М. Сміт, 1-ю групу буде Джон М. , а 2-ю групу буде Сміт.


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

^ затверджує позицію на початку рядка.

\ p {L} відповідає будь-якому листу з будь-якої мови

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

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

Отже, це має бути ім'я будь-якою мовою, що містить принаймні дві літери (або символи) без цифр чи інших символів.


майте на увазі, що деякі символи типу "і -" дійсні в іменах.
Mathijs Segers

1

Отже, із замовником ми створюємо цей божевільний регулярний вираз:

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

1

Імена та прізвища - це лише 2 речі, які ви повинні шукати:

  1. Довжина
  2. Зміст

Ось мій регулярний вираз:

var regex = /^ evidenceA-Za-z-,clear{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, і забезпечить наявність у імені мінімум двох компонентів (тобто перший + останній), але також дозволить будь-яку кількість середніх імен.

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

На момент написання цього тексту, здається, жодна з інших відповідей не відповідає усім цим критеріям. Навіть ^\p{L}{2,}$, яка є найближчою, не вистачає, тому що вона також відповідатиме "невидимим" символам, таким як U+FEFF(Zero Width No-Break Space).


не передає JavaScript для regexr.com 1) попередження, що функція unicode може підтримуватися не у всіх браузерах. 2) також допускає числа в регулярному вираженні. приклад: michael dimmittsasd2123123
Michael Dimmitt

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>


0

Це, здається, робить роботу для мене:

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

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