Я пытаюсь заменить заглавные буквы во всей строке их строчными аналогами, добавляя после нее дефис (если это не последняя буква). Чтоб Sunny&Cloudy
пришла sunny-&-cloudy
var name = 'Sunny&Cloudy';
name.replace(/([A-Z])(.*)/, '\L$1');
Я пробовал это сам, но он доходит только до первой заглавной буквы, добавляет дефис и останавливается. Оставь меня с -S
Какая часть вашего кода добавляет дефис?
name.toLowerCase().replace(/&/g, "-&-")
Можете ли вы добавить другие примеры, чтобы мы могли понять, что вам нужно делать в других сценариях?
Здравствуйте, не могли бы вы подробнее объяснить, где вы хотите добавить дефис? Будут ли они появляться в конце каждого слова? Будут ли все слова иметь & между ними? Спасибо !
@ GOTO0 Извините, я думаю, это был плохой пример. Я надеялся заменить &
на and
, когда у меня будет с чем работать. Можно ли дать &
то же обращение, что и заглавным буквам?
Итак, ваша цель — заменить Sunny&Cloudy
на sunny and cloudy
?
@DiegoTArg Надеюсь заменить каждую заглавную букву строчной и добавить дефис после этого слова. Я понятия не имею, как использовать регулярное выражение, поэтому мне интересно, возможно ли то, что я хочу.
@Shidersz Да, точно, но пробелы должны быть дефисами
Если вы хотите преобразовать 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
:) Ура!
Кстати, если в ваших словах есть числа, вам может понадобиться добавить 0-9
в регулярное выражение, чтобы сделать его [a-z0-9]
(и, возможно, [A-Z0-9]
, если числа могут быть первой буквой, но это затруднит разделение слов), или используйте границы слов, как кто-то написал в одном ответе ниже.
Один из возможных подходов к тому, что вам нужно, - использовать функция замены из Строка.заменить().
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». Я использую этот сайт всякий раз, когда мне нужно создать регулярное выражение.
Но
&
— это не заглавная буква. Зачем тебе дефис после него? Почему бы и нетsunny-&c-loudy
?