#javascript #regex #string #ecmascript-6
#javascript #регулярное выражение #строка #ecmascript-6
Вопрос:
Я хочу написать функцию, которая примет слово, а затем вернет измененное слово, где каждый кластер из двух согласных имеет тире между ними.
Например:
function('Internationalization')
=> 'In-ter-nationalization'
Это то, что у меня есть на данный момент:
function insertDash(word) {
const pattern = /[^a|e|i|o|u]{2}/gim;
const splitWord = word.split(pattern);
const dashedConsonant = word.match(pattern);
const fullWord =[];
let count = 0;
for (var i = 0; i < dashedConsonant.length; i ) {
fullWord.push(splitWord[count]);
fullWord.push(`${dashedConsonant[count][0]}-${dashedConsonant[count][1]}`);
count = 1;
}
fullWord.push(splitWord.slice(-1));
return fullWord.join('');
}
Однако мой шаблон РЕГУЛЯРНЫХ выражений не может вместить пробелы. Я получаю:
function('Le Wagon')
=> 'Le -Wagon'
Когда я действительно хочу:
function('Le Wagon')
=> 'Le Wagon'
Я был бы очень признателен за любые советы, рефакторинги или рекомендации.
Ответ №1:
Просто добавьте s
к вашему регулярному выражению, но также не забудьте вернуть слово целиком, если в вашем регулярном выражении нет совпадений:
function insertDash(word) {
const pattern = /[^a|e|i|o|u|s]{2}/gim;
const splitWord = word.split(pattern);
const dashedConsonant = word.match(pattern);
if (!dashedConsonant) return word;
const fullWord =[];
let count = 0;
for (var i = 0; i < dashedConsonant.length; i ) {
fullWord.push(splitWord[count]);
fullWord.push(`${dashedConsonant[count][0]}-${dashedConsonant[count][1]}`);
count = 1;
}
fullWord.push(splitWord.slice(-1));
return fullWord.join('');
}
Таким образом:
insertDash('Le Wagon internationalization')
> "Le Wagon in-ter-nationalization"
insertDash('internationalization')
> "in-ter-nationalization"
insertDash('Le Wagon')
> "Le Wagon"
insertDash('Le Wagon internationalization')
> "Le Wagon in-ter-nationalization"
Возможно, вы также захотите добавить больше специальных символов или лучше фильтровать только по согласным, поскольку ваше регулярное выражение прямо сейчас принимает в качестве символа все, что не является гласной. Может быть, вы хотите использовать /w[^a|e|i|o|u|s]{2}/gim
, чтобы учитывались только символы word.
Ответ №2:
Попробуйте с replace()
методом:
/([b-df-hj-np-tv-z])([b-df-hj-np-tv-z])/gi
let str = `Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.`;
const hyphenate = str => {
const rgx = /([b-df-hj-np-tv-z])([b-df-hj-np-tv-z])/gi;
return str.replace(rgx, '$1-$2');
}
console.log(hyphenate(str));
Ответ №3:
Я предлагаю
s.replace(/([aeiou][bcdfghj-np-tv-z] )(?=[bcdfghj-np-tv-z][aeiou])/gi, '$1-')
Смотрите демонстрацию регулярных выражений
Здесь разделяются только те согласные, которые находятся между гласными. Дефис вставляется между предпоследней согласной в совпадении.
Подробные сведения
([aeiou][bcdfghj-np-tv-z] )
— Группа 1 (обозначается$1
шаблоном замены): гласная ([aeiou]
), за которой следует 1 или более согласных ([bcdfghj-np-tv-z]
)(?=[bcdfghj-np-tv-z][aeiou])
— Позитивный прогноз (допускает последовательные совпадения), который подтверждает позицию перед согласной, за которой следует гласная.
Демонстрация JS:
let s = `Le Wagon
Internationalization
grasshopper
installation
propagate`;
let v = `[aeiou]`, c = `[bcdfghj-np-tv-z]`,
rx = new RegExp(`(${v}${c} )(?=${c}${v})`, 'gi');
console.log(
s.replace(rx, '$1-')
)