Заглавная буква первого слова внутри скобок

#javascript #regex

#javascript #регулярное выражение

Вопрос:

Я хочу, чтобы первая буква каждой строки была заглавной внутри скобок…

Если у нас есть эта строка:

 const text = 'This [forest or jungle] is [really] beautiful';
 

Желаемый результат будет 'This [Forest or jungle] is [Really] beautiful'

Пока:

У меня есть функция capitalize:

 function capitalize(string) {
    return string.charAt(0).toUpperCase()   string.slice(1);
} 
 

И здесь у нас есть этот код регулярного выражения для выбора строки внутри скобок:

 /(?<=[)(.*?)(?=])/g
 

Пожалуйста, помогите

Комментарии:

1. Каждое слово внутри скобок или только первое? Или вы имеете в виду, что вы можете сопоставить все, что вам нужно, с /[[a-z] ]/g регулярным выражением?

2. На самом деле первое слово.. Я пропустил этот момент… Спасибо

3. text.replace(/(?<=[)[a-z](?=[^][]*])/g, (x) => x.toLocaleUpperCase()) . Или может быть какая-либо буква в Юникоде? Нравится łąka ? Может /(?<=[)[^][](?=[^][]*])/g быть?

4. У вас уже есть совпадение text = text.replace(/(?<=[).*?(?=])/g, m => m.charAt(0).toUpperCase() m.slice(1)); , просто поместите код capitalize в обратный вызов

Ответ №1:

Вы можете использовать

 text = text.replace(/(?<=[)[a-z](?=[^][]*])/g, (x) => x.toLocaleUpperCase())
// OR
text = text.replace(/(?<=[)p{Ll}(?=[^][]*])/gu, (x) => x.toLocaleUpperCase())
 

Смотрите демонстрацию регулярных выражений / демонстрацию регулярных выражений # 2. Подробные сведения:

  • (?<=[) — положительный внешний вид, соответствующий местоположению, которому непосредственно предшествует [ символ
  • [a-z] — строчная буква ASCII
  • p{Ll} — любая строчная буква в Юникоде
  • (?=[^][]*]) — позитивный прогноз, который требует любых нулевых или более символов, отличных от [ и ] , а затем ] сразу справа от текущего местоположения.

Смотрите демонстрацию JavaScript:

 const text = 'This [forest or jungle] is [really] beautiful';
console.log( text.replace(/(?<=[)[a-z](?=[^][]*])/g, (x) => x.toLocaleUpperCase()) ) 

Ответ №2:

В вашем шаблоне уже есть совпадение, и вы можете опустить скобки для группы захвата. Затем вы можете использовать replace и использовать capitalize функцию в качестве обратного вызова.

Пример использования вашего слегка измененного шаблона без группы захвата:

 function capitalize(string) {
  return string.charAt(0).toUpperCase()   string.slice(1);
}
let text = 'This [forest or jungle] is [really] beautiful';
text = text.replace(/(?<=[). ?(?=])/g, capitalize);
console.log(text); 

Немного более производительным шаблоном может быть использование отрицаемого символьного класса

 (?<=[)[^][] (?=])
 

Демонстрация регулярных выражений

Шаблон соответствует:

  • (?<=[) Укажите a [ слева
  • [^][] Сопоставьте 1 раз любой символ, кроме [ или ]
  • (?=]) Укажите a ] справа

Или с отрицаемым символьным классом

 const capitalize = s => s.charAt(0).toUpperCase()   s.slice(1);
let text = 'This [forest or jungle] is [really] beautiful';
text = text.replace(/(?<=[)[^][] (?=])/g, capitalize);
console.log(text); 

Ответ №3:

Для ответа на приведенный выше вопрос попробуйте следующий код:

 let a = (x) => {let y = x.split('');y.forEach((z,i) => {if(z == '['){y[i 1]=y[i 1].toUpperCase()};});return y.join('');}
 

Разделите его на массив и преобразуйте следующее найденное слово в верхний регистр.

Ответ №4:

например, используйте замену строки и регулярное выражение, которое соответствует фигурным скобкам и фиксирует текст между ними, например… /[([^]] )]/g … который гласит …

  • / ... /g … глобально …
  • … сопоставьте открывающую скобку [
  • … затем запишите хотя бы один символ (или его последовательность), который не является закрывающей скобкой ([^]] )
  • … затем сопоставьте закрывающую скобку ] .
 const textSample = 'This [forest or jungle] is [really] beautiful.';
const regXCapture = (/[([^]] )]/g);

console.log(
  textSample.replace(regXCapture, (match, capture) =>
    `[${ capture[0].toLocaleUpperCase() }${ capture.slice(1) }]`
  )
); 
 .as-console-wrapper { min-height: 100%!important; top: 0; }