Есть строка:
var stroka = "ДелимСловаНаЧасти"
Мы хотим разделить слова в этой строке по принципу заглавной буквы. Как это сделать?
Способ № 1 — при помощи регулярных выражений
Когда мы работаем со строками, тогда желательно использовать регулярные выражения RegExp для их преобразований и трансформаций.
Это лучший инструмент для работы со строками. В нашей задаче мы будем искать те места в строке, где последовательно идут строчная и заглавная буквы.
Мы ограничимся русским языком и его алфавитом символов.
Как обозначить строчные буквы русского алфавита в регулярном выражении в JavaScript?
Внутри шаблона RеgExp будет действовать конструкция, которая называется «Класс Символа». По сути это набор букв из которых будет состоять сивол.
[а-яё]
Как обозначить заглавные буквы русского алфавита в регулярном выражении в JavaScript?
[А-ЯЁ]
Теперь нам нужно найти ГРАНИЦЫ между подобными случаями. За ГРАНИЦЫ в RegExp отвечает Утверждение (Assertion). Всего их существует 8 штук. Поиск мест стыковки двух нужных нам символов будет выглядеть так:
[а-яё](?=[А-ЯЁ])
Теперь обернём это границами регулярного выражения:
/[а-яё](?=[А-ЯЁ])/
Добавим ГЛОБАЛЬНЫЙ ФЛАГ для сопоставления всех искомых мест в строке:
/[а-яё](?=[А-ЯЁ])/g
Применим метод разделения строки [Symbol.split]() на основе регулярного выражения:
/(?=[А-ЯЁ])/g[Symbol.split]("ДелимСловаНаЧасти")
На выходе получаем массив:
Способ № 2 — при помощи метода массивов map()
// Делаем из строки массив var massiv = [...stroka] // Добавляем пробелы перед заглавными буквами. Не трогаем первую букву (оставляем как есть). var massiv2 = massiv.map(i => { if(x==0 && i.toUpperCase() == i){x++; return i} else if(i.toUpperCase() == i){return " " + i} else{return i} }, x=0) // Склеиваем элементы нового массива в строку var stroka2 = massiv2.join("")
Результат выполнения алгоритма:
Мы разделили слипшуюся последовательность слов на отдельные слова с пробелами. Первая заглавная буква в итоговой строке осталась без изменений — перед ней нет пробела.
Функция, разделяющая строку по заглавным буквам, добавляя пробелы перед заглавными буквами, кроме первой заглавной
function delimstroku (str){ return [...str] .map(i=>{ if(x==0&&i.toUpperCase()==i){x++; return i} else if(i.toUpperCase()==i){return " " + i} else{return i} }, x=0) .join("") }
Получаем строку:
"Делим Слова На Части"
Функция, разделяющая строку по заглавным буквам, добавляя пробелы перед заглавными буквами и уменьшая их регистр, кроме первой
function delimstroku (str){ return [...str] .map(i=>{ if(x==0&&i.toUpperCase()==i){x++; return i.toUpperCase()} else if(i.toUpperCase()==i){return " " + i.toLowerCase()} else{return i} }, x=0) .join("") }
Получаем строку:
"Делим слова на части"
Информационные ссылки
Стандарт ECMAScript — Раздел «23.1 Array Objects» — https://tc39.es/ecma262/#sec-array-objects