#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]
— строчная буква ASCIIp{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; }