В JS предусмотрено два метода для работы с регистром:
- Преобразование в верхний регистр:
String.prototype.toUpperCase()
почитать - Преобразование в нижний регистр:
String.prototype.toLowerCase()
почитать
Применяются они к строке:
let str = "Да ЗДРавСтвуЕТ свЕТ!"
console.log(str.toUpperCase()); // 'ДА ЗДРАВСТВУЕТ СВЕТ!'
console.log(str.toLowerCase()); // 'да здравствует свет!'
Со стандартными методами все понятно.
Как в JS сделать так, чтобы первая буква каждого слова была заглавная?
Изначально такой метод не предусмотрен.
Давай напишем свою функцию:
function formatTitle(str) {
// В переменную words получаем массив из слов
let words = str.toLowerCase() // Приведем всю строку к нижнему регистру
.split(" "); // И разделим все слова по пробелу
let result = ""; // Сюда будем записывать результат
words.forEach(word => { // Проходим по массиву words циклом
if (word) { // если элемент массива !undefined
let a = word.split("")[0] // разделяем слово по символам и берем первый символ
.toUpperCase() // конвертируем в верхний регистр
let b = word.slice(1) // вторая часть слова (без первой буквы)
result += a + b + " "; // в результат объединяем первую большую букву со второй частью слова
}
})
return result.trim(); // возвращаем результат и убираем лишний пробел в конце
}
// Используем функцию
let str = "Да ЗДРавСтвуЕТ свЕТ!";
console.log(formatTitle(str)); // 'Да Здравствует Свет!'
При работе я столкнулся с проблемой: если в строке есть перенос текста — функция неправильно обрабатывает ее.
let str = `
Да ЗДРавСтвуЕТ свЕТ!
Да ЗДРавСтвуЕТ свЕТ!
`;
console.log(formatTitle(str)); // 'да Здравствует Свет!
// да Здравствует Свет!'
Я пришел к тому, что нужно дописать её с учетом наличия переносов строк. Для этого потребуется нашу строку для начала разделить на ряды, а потом уже бегая циклом по каждому ряду производить манипуляции со словами в ряду.
function formatTitle(str) {
let rows = str.toLowerCase().split("\n"); // Получаем массив строк разделяя переносом \n
let result = "";
rows.forEach(function (row) { // Проходим по массиву rows циклом
let words = row.split(" "); // Получаем массив слов из строки разделяя пробелом
let wordsResult = "";
words.forEach(function (word) { // Проходим по массиву words циклом
word ? (wordsResult += " " + word.split("")[0].toUpperCase() + word.slice(1)) : "";
});
result += wordsResult.trim() + "\n";
});
return result;
}
// Ура!
let str = `
Да ЗДРавСтвуЕТ свЕТ!
Да ЗДРавСтвуЕТ свЕТ!
`;
console.log(formatTitle(str)); // 'Да Здравствует Свет!
// Да Здравствует Свет!'
Как сделать инверсию регистра в JS?
Суть инверсии регистра в том, чтобы из ааАА
получилось ААаа
.
Решение:
function formatInverse(str) {
let result = ""; // Сюда записываем результат
let char = ""; // Вспомогательная переменная для символа
for (var i = 0; i < str.length; i++) { // Проходим по строке str циклом
char = str.charAt(i); // Символ записываем в переменную
if (char.toLowerCase() === char) { // Если символ в нижнем регистре
char = char.toUpperCase(); // Конвертируем в верхний регистр
} else if (char.toUpperCase() === char) { // Если символ в верхнем регистре
char = char.toLowerCase(); // Конвертируем в нижний регистр
}
result += char; // В результат записываем символ с уже инвертированным регистром
}
return result;
}
// Ура!
let str = "aaAAaa";
console.log(formatInverse(str)); // 'AAaaAA'
Изменяем регистр как в предложениях: каждое предложение с заглавной буквы с помощью JavaScript
Здесь не обойтись без регулярных выражений.
В данном случае регулярное выражение ищет все символы которые идут после знаков «.», «!», «?» и «\n».
function formatSentence(str) {
return str.toLowerCase().replace(/((^\s*\D|[\.\!\?\n]\s*\D))/g, function (c) {
return c.toUpperCase();
});
}
//Пример
let str = `Да, ЗДРавСтвуЕТ свЕТ? Да ЗДРавСтвуЕТ свЕТ! Да ЗДРавСтвуЕТ свЕТ.`;
console.log(formatSentence(str)); // 'Да, здравствует свет? Да здравствует свет! Да здравствует свет.'