Как реализовать gsub в JS, чтобы заменить кластер символов в строке? - PullRequest
0 голосов
/ 30 марта 2019

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

Например:

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('');
}

Однако мой шаблон REGEX не может вместить пробелы.Я получаю:

function('Le Wagon')
=> 'Le -Wagon'

Когда я действительно хочу:

function('Le Wagon')
=> 'Le Wagon'

Буду очень признателен за любые советы, рефакторинги или советы.

Ответы [ 3 ]

0 голосов
/ 30 марта 2019

Попробуйте с помощью 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));
0 голосов
/ 30 марта 2019

Я предлагаю

s.replace(/([aeiou][bcdfghj-np-tv-z]+)(?=[bcdfghj-np-tv-z][aeiou])/gi, '$1-')

См. Демонстрационную версию regex

Здесь разделены только те согласные, которые находятся между гласными.Дефис вставляется между последним, но одним и последними согласными в совпадении.

Подробности

  • ([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-')
)
0 голосов
/ 30 марта 2019

Просто добавьте \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, поэтому учитываются только символы слов.

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