JavaScript | Как разъединить слипшуюся строку по заглавным буквам?

JavaScript | Как разъединить слипшуюся строку по заглавным буквам?

 

Есть строка:

var stroka = "ДелимСловаНаЧасти"

Мы хотим разделить слова в этой строке по принципу заглавной буквы. Как это сделать?

 

Способ № 1 — при помощи регулярных выражений

Когда мы работаем со строками, тогда желательно использовать регулярные выражения RegExp для их преобразований и трансформаций.

Это лучший инструмент для работы со строками. В нашей задаче мы будем искать те места в строке, где последовательно идут строчная и заглавная буквы.

Мы ограничимся русским языком и его алфавитом символов.

Как обозначить строчные буквы русского алфавита в регулярном выражении в JavaScript?

Внутри шаблона RеgExp будет действовать конструкция, которая называется «Класс Символа». По сути это набор букв из которых будет состоять сивол.

[а-яё]

Как обозначить заглавные буквы русского алфавита в регулярном выражении в JavaScript?

[А-ЯЁ]

 

Теперь нам нужно найти ГРАНИЦЫ между подобными случаями. За ГРАНИЦЫ в RegExp отвечает Утверждение (Assertion). Всего их существует 8 штук. Поиск мест стыковки двух нужных нам символов будет выглядеть так:

[а-яё](?=[А-ЯЁ])

Теперь обернём это границами регулярного выражения:

/[а-яё](?=[А-ЯЁ])/

Добавим ГЛОБАЛЬНЫЙ ФЛАГ для сопоставления всех искомых мест в строке:

/[а-яё](?=[А-ЯЁ])/g

Применим метод разделения строки [Symbol.split]() на основе регулярного выражения:

/(?=[А-ЯЁ])/g[Symbol.split]("ДелимСловаНаЧасти")

На выходе получаем массив:

Разделили строку по заглавным буквам русского языка и сложили слова в массив - JavaScript
Разделили строку по заглавным буквам русского языка и сложили слова в массив — JavaScript

 

Способ № 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("")

Результат выполнения алгоритма:

Разделили строку по заглавным буквам - JavaScript
Разделили строку по заглавным буквам — JavaScript

Мы разделили слипшуюся последовательность слов на отдельные слова с пробелами. Первая заглавная буква в итоговой строке осталась без изменений — перед ней нет пробела.

 

Функция, разделяющая строку по заглавным буквам, добавляя пробелы перед заглавными буквами, кроме первой заглавной

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("")
}
Функция разделяющая строку по заглавным буквам - JavaScript
Функция разделяющая строку по заглавным буквам — JavaScript

Получаем строку:

"Делим Слова На Части"

 

Функция, разделяющая строку по заглавным буквам, добавляя пробелы перед заглавными буквами и уменьшая их регистр, кроме первой

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("")
}
Функция разделяющая строку по заглавным буквам, уменьшая регистр, кроме первой - JavaScript
Функция разделяющая строку по заглавным буквам, уменьшая регистр, кроме первой — JavaScript

Получаем строку:

"Делим слова на части"

 

Информационные ссылки

JavaScript | Массивы (Array)

Стандарт ECMAScript — Раздел «23.1 Array Objects» — https://tc39.es/ecma262/#sec-array-objects