#javascript
#javascript
Вопрос:
Недавно я пытался проверить текст в предложении или абзаце, чтобы найти слова в верхнем регистре и сделать их регистром заголовка. Пример: 123 SOMEWHERE DR
будет отформатирован в 123 Somewhere Dr
. Я могу заставить это работать отлично, но одна область, в которой я немного застрял, — это когда есть специальные символьные элементы, например: TEST-THIS
будет отформатирован This-Test
и O'SHEA
будет отформатирован O'Shea
.
Я думал, что мог бы использовать .replace()
, но это не так. Я могу записать оба Test
и This
, а также O
и Shea
, но, похоже, я не могу вернуть их к исходной строке.
Конечный результат должен выглядеть так: 123 West Main Street. Lorem ipsum dolor sit amet, Test-This. New line and O'Shea!
.
Я видел много сообщений на SO о написании первой буквы предложения с заглавной буквы, или о каждом слове с заглавной буквы, или о поиске слов с заглавной буквы и т. Д., Но я пока не нашел ничего столь же конкретного, как это. Любая помощь или советы приветствуются. Если я смогу добавить или ответить на что-либо еще, пожалуйста, дайте мне знать, и я соответствующим образом обновлю вопрос.
const string = "123 WEST MAIN STREET. Lorem ipsum dolor sit amet, TEST-THIS. New line and O'SHEA!";
function capitalizeIt(chunk) {
const text = chunk.split(' ');
const formatString = text.map((item) => {
const words = item;
const specialChars = ["'", "_", "-"];
const specialRegex = new RegExp('[' specialChars.join('') ']');
const specials = words.split(specialRegex);
if (words === words.toUpperCase()) {
let capLetters = words[0] words.slice(1).toLowerCase();
// Here is where I am attempting to format capitalized words
// that use a special character.
if (specials.length > 1) {
specials.map((o) => {
let test = o[0] o.slice(1).toLowerCase();
// I can log test and see both 'Test' and 'This'
// and 'O' and 'Shea', but here is where I am having
// a hard time getting them formatted correctly.
// console.log(test);
capLetters.replace(test);
});
}
return capLetters;
} else {
return words;
}
});
// look for 'undefined' and add line break
for (let i = 0; i < formatString.length; i ) {
if (formatString[i] === 'undefined') {
formatString[i] = 'nn';
}
}
// output finalString to view for testing
const finalString = formatString.join(' ');
document.querySelector('p').textContent = finalString;
}
capitalizeIt(string);
<p id='content'></p>
Ответ №1:
Альтернативный подход заключается в использовании псевдохарактеров границы слова ( b
):
const allCapsWords = /b[A-Z]{2,}b/g;
const string = "123 WEST MAIN STREET. Lorem ipsum dolor sit amet, TEST-THIS. New line and O'SHEA!";
const titleCased = string.replace(
allCapsWords,
word => word[0] word.slice(1).toLowerCase());
// "123 West Main Street. Lorem ipsum dolor sit amet, Test-This. New line and O'Shea!"
Комментарии:
1. Я подумал, что когда я опубликую свой код, кто-нибудь может опубликовать какой-нибудь код и заставить мой выглядеть глупо. Это оно, и это потрясающе! Я не знал о всей части псевдохарактеров границы слова, и мне нужно прочитать об этом. Большое спасибо за ваше время и помощь.