Регулярное выражение для имени и фамилии
Для проверки сайта мне нужно проверить имя и фамилию.
Для первого имени оно должно содержать только буквы и может состоять из нескольких слов с пробелами и без букв, как минимум 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}"
Я знаю, что эта проверка полностью предполагает, что у каждого человека, заполняющего форму, есть западное имя, и это может исключить подавляющее большинство людей в мире. Однако я чувствую, что это шаг в правильном направлении. Возможно, это регулярное выражение является слишком базовым для гуру, чтобы его можно было упростить, или, может быть, есть какая-то другая причина, по которой я не смог найти вышеуказанный код в своих поисках. Я потратил слишком много времени, пытаясь выяснить это, вы, вероятно, заметите, насколько туманным является мое мнение обо всем этом, если вы посмотрите на мои названия тестов ниже.
Я проверил код на следующих именах, и результаты в скобках справа от каждого имени.
- Стив Смит (неудача)
- Stev3 Smith (неудача)
- Стив Смит (неудача)
- Стив Смит (неудача)
- Стив См1 (передано Стиву См)
- д'Аре, чтобы остерегаться
- Джо Блоу (прошло)
- Hyoung Kyoung Wu (прошло)
- Майк О'Нил (прошло)
- Стив Джонсон-Смит (прошло)
- Йозеф-Шмозев Гимдел (пройдено)
- О Генри Смит (прошло)
- Mathais d'Arras (пройдено)
- Мартин Лютер Кинг младший (прошло)
- Downtown-Джеймс Браун (пройдено)
- Даррен Маккарти (прошло)
- Джордж Де ФанкМастер (пройдено)
- Kurtis B-Ball Баскетбол (прошло)
- Ахмад эль Джеффе (прошло)
Если у вас есть базовые имена, для работы приведенного выше кода должно быть от одного до пяти, аналогичных тем, которые я использовал во время тестирования, этот код может быть для вас.
Если у вас есть какие-либо улучшения, пожалуйста, дайте мне знать. Я только на ранних стадиях (первые несколько месяцев выясняли 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}
Он будет недействителен, если есть:-
- Любой пробел в начале или в конце имени
- Есть символы, например @
- Менее 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 буквы (или символы) без цифр или других символов.
Для имен и фамилий есть только две вещи, которые вы должны искать:
- длина
- содержание
Вот мое регулярное выражение:
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
Пространство без перерывов нулевой ширины.
Я обычно пишу:
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 выполнит эту работу.