Найдите все заглавные слова в абзаце и верните регистр заголовка с помощью JavaScript

#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. Я подумал, что когда я опубликую свой код, кто-нибудь может опубликовать какой-нибудь код и заставить мой выглядеть глупо. Это оно, и это потрясающе! Я не знал о всей части псевдохарактеров границы слова, и мне нужно прочитать об этом. Большое спасибо за ваше время и помощь.