Замените заглавные буквы во всей строке строчными буквами и дефисами

Я пытаюсь заменить заглавные буквы во всей строке их строчными аналогами, добавляя после нее дефис (если это не последняя буква). Чтоб Sunny&Cloudy пришла sunny-&-cloudy

var name = 'Sunny&Cloudy';
name.replace(/([A-Z])(.*)/, '\L$1');

Я пробовал это сам, но он доходит только до первой заглавной буквы, добавляет дефис и останавливается. Оставь меня с -S

Но & — это не заглавная буква. Зачем тебе дефис после него? Почему бы и нет sunny-&c-loudy?

GOTO 0 29.05.2019 23:58

Какая часть вашего кода добавляет дефис?

PM 77-1 29.05.2019 23:58

name.toLowerCase().replace(/&/g, "-&-")

Juan Navarrete 29.05.2019 23:59

Можете ли вы добавить другие примеры, чтобы мы могли понять, что вам нужно делать в других сценариях?

Shidersz 30.05.2019 00:00

Здравствуйте, не могли бы вы подробнее объяснить, где вы хотите добавить дефис? Будут ли они появляться в конце каждого слова? Будут ли все слова иметь & между ними? Спасибо !

DiegoTArg 30.05.2019 00:01

@ GOTO0 Извините, я думаю, это был плохой пример. Я надеялся заменить & на and, когда у меня будет с чем работать. Можно ли дать & то же обращение, что и заглавным буквам?

WillMac997 30.05.2019 00:05

Итак, ваша цель — заменить Sunny&Cloudy на sunny and cloudy?

Shidersz 30.05.2019 00:07

@DiegoTArg Надеюсь заменить каждую заглавную букву строчной и добавить дефис после этого слова. Я понятия не имею, как использовать регулярное выражение, поэтому мне интересно, возможно ли то, что я хочу.

WillMac997 30.05.2019 00:10

@Shidersz Да, точно, но пробелы должны быть дефисами

WillMac997 30.05.2019 00:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
9
4 422
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Если вы хотите преобразовать Sunny&Cloudy в sunny-&-cloudy, то следующий код должен работать:

var name = 'Sunny&Cloudy';
name.replace(/[A-Z][a-z]*/g, str => '-' + str.toLowerCase() + '-')
  // Convert words to lower case and add hyphens around it (for stuff like "&")
  .replace('--', '-') // remove double hyphens
  .replace(/(^-)|(-$)/g, ''); // remove hyphens at the beginning and the end

По сути, вы просто используете function в качестве второго параметра .replace. (Ссылка)

Однако это не только замена заглавной буквы их строчной копией, поэтому вы можете пересмотреть описание своего вопроса.

Это хорошо работает! Я только что добавил .replace('&', 'and'), чтобы изменить & на and :) Ура!

WillMac997 30.05.2019 00:26

Кстати, если в ваших словах есть числа, вам может понадобиться добавить 0-9 в регулярное выражение, чтобы сделать его [a-z0-9] (и, возможно, [A-Z0-9], если числа могут быть первой буквой, но это затруднит разделение слов), или используйте границы слов, как кто-то написал в одном ответе ниже.

Xiaoyi Cao 30.05.2019 00:41

Один из возможных подходов к тому, что вам нужно, - использовать функция замены из Строка.заменить().

var name = 'Sunny&Cloudy';

let res = name.replace(/[A-Z&]/g, m => m === "&" ? "-and-" : m.toLowerCase());

console.info(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

Вы можете использовать границы слов \b, чтобы разбить строку на токены, преобразовать все в нижний регистр (кроме последней буквы) и соединить результат вместе с - тире

function dashed(str, sep) {
  let words = str.split(sep);
  return words.map(word => {
    let left = word.slice(0, -1).toLowerCase();
    let lastLetter = word.slice(-1);
    return `${left}${lastLetter}`
  }).join('-')

}

console.info(
  dashed("Sunny&CloudY&Rainy", /\b/)
)

Следующее регулярное выражение должно помочь:

const regex = /(.+?\b)+?/g;
const str = 'Sunny&Cloudy&rainy';
const subst = '$1-';
const result = str.replace(regex, subst);

//make string lowercase + remove last '-'
console.info('Substitution result: ', result.toLowerCase().substring(0, result.length - 1));

Кстати, regex101.com может пригодиться для улучшения регулярного выражения. Вы можете выбрать параметр регулярного выражения «ECMAScript/JavaScript». Я использую этот сайт всякий раз, когда мне нужно создать регулярное выражение.

Другие вопросы по теме