Помогите написать регулярное выражение на js

Как говорится, если хочешь решить проблему с помощью регулярных выражений, то у тебя две проблемы. Прошу помощи написать регулярку для следующих условий:

В поле для имени менеджера нужно:

  • разрешить пробелы, но не в начале и не в конце
  • разрешить только буквенные символы (без цифр) на кириллице и латинице
  • разрешить символы "',.- (и пробел)

Я попробовал вот такую: /^[^\s]+[\w\s"',.]+[^\s]+$/g Но по ней не проходит строка меньше трёх символов и не проходит кириллица

Должны проходить следующие значения:

Иванов Иван Иванович
Иванов "Ванёк" Иван
Иванов 'Ванёк' Иван
Иванов Вань-Вань Иван
Иванов Ivan
Ivan Ivaнович
Иванов Иван, Петров Петр
Иванов. Петров. Сидоров.

Не должны проходить:

Ив%н
Иван1
 Ваня  (тут пробел в начале и в конце)
Иванов№!:?*()><?/

Ответы (4 шт):

Автор решения: Aziz Umarov

Попробуйте так

   ^[а-яА-ЯёЁa-zA-Z"',.-]+(\s+[а-яА-ЯёЁa-zA-Z"',.-]+)*$|^$

обновил

→ Ссылка
Автор решения: dIm0n

Вот так вот (хотя бы 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 можно укоротить регулярку, если писать буквы только в одном регистре

→ Ссылка
Автор решения: renich

Примеры ТС проходят.

/^(?:[^\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

→ Ссылка
Автор решения: Qwertiy

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

→ Ссылка