Ограничить количество определенных символов в строке

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

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

/^[a-zA-Z\s]{8,20}$/

Эта регулярка мне очень нравиться, но она не ограничивает количество пробелов. Строка может состоять вся из пробелов- это нужно пресекать. Я конечно понимаю что могу использовать trimLeft trimRight однако строка вида a b пройдет через трим и все еще будет не приемлема. Желаемая регулярка все еще не найдена. Придется использовать алгоритмическое решение.


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

Автор решения: Wiktor Stribiżew

Используйте

^(?=.{8,20}$)\s*[a-zA-Z]+(?:\s+[a-zA-Z]+)*\s*$

См. пример работы регулярного выражения.

Подробности

  • ^ - начало строки
  • (?=.{8,20}$) - в строке должно быть от 8 до 20 символов, отличных от перевода строки (если текст многострочный, добавьте флаг s, /^(?=.{8,20}$)\s*[a-zA-Z]+(?:\s+[a-zA-Z]+)*\s*$/s)
  • \s* - ноль и более пробельных символов
  • [a-zA-Z]+ - одна и более букв ASCII
  • (?:\s+[a-zA-Z]+)* - ноль и более повторов последовательности ноля и более пробельных символов, за которыми следует одна и более букв ASCII
  • \s* - ноль и более пробельных символов
  • $ - конец строки.
→ Ссылка
Автор решения: Qwertiy

Как-то так:

/^(?=\S)(?=(\S*\s){2,4}\S+$)[a-z\s]{8,20}$/i
→ Ссылка