изменить регистр с помощью регулярного выражения

Я хочу преобразовать этот текст

font-size-18

к этому

fontSize18

с помощью регулярного выражения. Вот мой след:

let conv = str => str.replace(/\-[a-z]/gi,/[A-Z]/gi);

но это не работает, я могу сделать это без Regex. Но я хочу сделать это с помощью регулярного выражения, можно ли это сделать с помощью регулярного выражения?


person Ahmed Elbessfy    schedule 10.11.2018    source источник


Ответы (3)


Сопоставьте тире, за которым следует один символ, и используйте функцию-заменитель, которая возвращает этот символ toUpperCase:

const dashToCamel = str => str.replace(/-(\w)/g, (_, g1) => g1.toUpperCase());
console.log(dashToCamel("font-size-18"));

Это предполагает, что за всеми тире следуют символы слова (хотя вы можете использовать . вместо \w). Обратите внимание, что поскольку кажется, что вы хотите заменить все тире, вам следует сопоставить и заменить все тире, а не только тире, за которыми следуют буквы алфавита.

person CertainPerformance    schedule 10.11.2018
comment
Отлично, я хочу заменить только тире, за которыми следуют символы. Ваш код будет работать, но у меня есть вопрос: почему _ в этой функции замены? Я думаю, это должно быть - - person Ahmed Elbessfy; 10.11.2018
comment
Это аргумент, а не строка. Первый аргумент — это полное совпадение, в котором нет необходимости — мы хотим заменить его только первой захваченной группой (которая является вторым аргументом) в верхнем регистре. - person CertainPerformance; 11.11.2018

Ваша функция замены использует -[a-z], который будет соответствовать только -s и будет замените это на /[A-Z]/gi.

Вы можете сделать сопоставление немного более конкретным, чтобы захватить все части без тире в группе захвата и использовать toUpperCase для группы (группа 2), которая захватывает s

([a-z]+)-([a-z])([a-z]*)-(\d+)

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

Это будет соответствовать

  • ([a-z]+) Захватите 1+ раз a-z в группу 1
  • - Соответствовать буквально
  • ([a-z]) Захват отдельных az в группу 2
  • ([a-z]*) Захватите 0+ раз а-я в группу 3
  • - Соответствовать буквально
  • (\d+) Захват 1+ цифр в группу 4

const conv = str => str.replace(
  /([a-z]+)-([a-z])([a-z]*)-(\d+)/g,
  (_, p1, p2, p3, p4) => p1 + p2.toUpperCase() + p3 + p4
);
console.log(conv("font-size-18"));

person The fourth bird    schedule 10.11.2018
comment
немного сложно, но здорово. Большое спасибо - person Ahmed Elbessfy; 10.11.2018
comment
@AhmedElbessfy Я добавил объяснение регулярного выражения. - person The fourth bird; 10.11.2018
comment
хорошо, что такое p1,p2,p3,p4? - person Ahmed Elbessfy; 10.11.2018
comment
@AhmedElbessfy Это номера захваченных групп, которые replace может получить доступ. - person The fourth bird; 10.11.2018
comment
О, хорошо, а в этом (, p1, p2, p3, p4) => p1 + p2.toUpperCase() ? - person Ahmed Elbessfy; 10.11.2018

эхо-размер шрифта-18 | sed "s/-s/S/g" | sed "с/-1/1/г"

person mohamadrezà    schedule 10.11.2018
comment
ой, не работает?! - person mohamadrezà; 10.11.2018
comment
Это даже не на правильном языке - person CertainPerformance; 10.11.2018
comment
скопируйте и вставьте его в терминал и нажмите Enter :| - person mohamadrezà; 10.11.2018
comment
спасибо за попытку помочь, но я хочу это в javascript. Я думаю, это Php - person Ahmed Elbessfy; 10.11.2018
comment
Ага. Это с sed с bash - person mohamadrezà; 10.11.2018