Помогите написать регулярное выражение на js
Как говорится, если хочешь решить проблему с помощью регулярных выражений, то у тебя две проблемы. Прошу помощи написать регулярку для следующих условий:
В поле для имени менеджера нужно:
- разрешить пробелы, но не в начале и не в конце
- разрешить только буквенные символы (без цифр) на кириллице и латинице
- разрешить символы "',.- (и пробел)
Я попробовал вот такую: /^[^\s]+[\w\s"',.]+[^\s]+$/g Но по ней не проходит строка меньше трёх символов и не проходит кириллица
Должны проходить следующие значения:
Иванов Иван Иванович
Иванов "Ванёк" Иван
Иванов 'Ванёк' Иван
Иванов Вань-Вань Иван
Иванов Ivan
Ivan Ivaнович
Иванов Иван, Петров Петр
Иванов. Петров. Сидоров.
Не должны проходить:
Ив%н
Иван1
Ваня (тут пробел в начале и в конце)
Иванов№!:?*()><?/
Ответы (4 шт):
Попробуйте так
^[а-яА-ЯёЁa-zA-Z"',.-]+(\s+[а-яА-ЯёЁa-zA-Z"',.-]+)*$|^$
обновил
Вот так вот (хотя бы 1 символ либо пустая строка):
(?:^[а-яА-ЯёЁa-zA-Z"',.-]+(?:\s+[а-яА-ЯёЁa-zA-Z"',.-]+)*$)|^$
Тест https://regex101.com/r/VnNxYh/2
Иванов Иван Иванович
Иванов "Ванёк" Иван
Иванов 'Ванёк' Иван
Иванов Вань-Вань Иван
Иванов Ivan
Ivan Ivaнович
Иванов Иван, Петров Петр
Иванов. Петров. Сидоров.
ffff fffff
Ив%н
Иван1
Ваня
Ваня
Ваня
Иванов№!:?*()><?/
Сгенерированный код:
const regex = /(?:^[а-яА-ЯёЁa-zA-Z"',.-]+(?:\s+[а-яА-ЯёЁa-zA-Z"',.-]+)*$)|^$/gm;
const str = `Иванов Иван Иванович
Иванов "Ванёк" Иван
Иванов 'Ванёк' Иван
Иванов Вань-Вань Иван
Иванов Ivan
Ivan Ivaнович
Иванов Иван, Петров Петр
Иванов. Петров. Сидоров.
ffff fffff
Ив%н
Иван1
Ваня
Ваня
Ваня
Иванов№!:?*()><?/`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
Как указали в других ответах, при наличии опции i можно укоротить регулярку, если писать буквы только в одном регистре
Примеры ТС проходят.
/^(?:[^\s\d][a-zа-яё\s"',.-]+[^\s\d])?$/i
let pattern = new RegExp("^(?:[^\\s\\d][a-zа-яё\\s\\\"',.-]+[^\\s\\d])?$", "i");
console.log(pattern.test("")); //true
console.log(pattern.test("Иванов Иван Иванович")); //true
console.log(pattern.test('Иванов "Ванёк" Иван')); //true
console.log(pattern.test("Иванов 'Ванёк' Иван")); //true
console.log(pattern.test("Иванов Вань-Вань Иван")); //true
console.log(pattern.test("Иванов Ivan")); //true
console.log(pattern.test("Ivan Ivaнович")); //true
console.log(pattern.test("Иванов Иван, Петров Петр")); //true
console.log(pattern.test("Иванов. Петров. Сидоров.")); //true
console.log(pattern.test("Ив%н")); //false
console.log(pattern.test("Иван1")); //false
console.log(pattern.test(" Ваня ")); //false
console.log(pattern.test("Иванов№!:?*()><?/")); //false
var regex = /^(?!\s)((?!\s$)[-A-ZА-ЯЁ"',.\s])*$/i
var yes = [
"Иванов Иван Иванович",
'Иванов "Ванёк" Иван',
"Иванов 'Ванёк' Иван",
"Иванов Вань-Вань Иван",
"Иванов Ivan",
"Ivan Ivaнович",
"Иванов Иван, Петров Петр",
"Иванов. Петров. Сидоров.",
]
var no = [
"Ив%н",
"Иван1",
" Ваня ",
"Иванов№!:?*()><?/",
]
console.log(yes.every(s => regex.test(s)))
console.log(no.every(s => !regex.test(s)))
Если есть возможность использовать более новый стандарт js, то можно упростить:
var regex = /^(?!\s)[-A-ZА-ЯЁ"',.\s]*(?<!\s)$/i
var yes = [
"Иванов Иван Иванович",
'Иванов "Ванёк" Иван',
"Иванов 'Ванёк' Иван",
"Иванов Вань-Вань Иван",
"Иванов Ivan",
"Ivan Ivaнович",
"Иванов Иван, Петров Петр",
"Иванов. Петров. Сидоров.",
]
var no = [
"Ив%н",
"Иван1",
" Ваня ",
"Иванов№!:?*()><?/",
]
console.log(yes.every(s => regex.test(s)))
console.log(no.every(s => !regex.test(s)))
Чтобы запретить переводы строк:
var regex = /^(?!\s)((?!\n|\s$)[-A-ZА-ЯЁ"',.\s])*$/i
var yes = [
"Иванов Иван Иванович",
'Иванов "Ванёк" Иван',
"Иванов 'Ванёк' Иван",
"Иванов Вань-Вань Иван",
"Иванов Ivan",
"Ivan Ivaнович",
"Иванов Иван, Петров Петр",
"Иванов. Петров. Сидоров.",
]
var no = [
"Ив%н",
"Иван1",
" Ваня ",
"Иванов№!:?*()><?/",
]
console.log(yes.every(s => regex.test(s)))
console.log(no.every(s => !regex.test(s)))