Как сгруппировать разные буквы (не обязательно подряд), используя регулярное выражение - PullRequest
4 голосов
/ 01 октября 2019

В приведенном ниже примере ожидаемые результаты:

const str = "abbcccddddeeeeeffffff";

const res = str.match(/(.)\1*/g);

console.log(res);

Но если я попытаюсь сгруппировать непоследовательные буквы:

const str = "abxbcxccdxdddexeeeefxfffffxx";

const res = str.match(/(.)\1*/g);

console.log(res);

Я хотел бы получить что-то вроде этого:

[ 'a', 'bb', 'xxxxxxx', 'ccc', 'dddd', 'eeeee', 'ffffff']

Ответы [ 2 ]

7 голосов
/ 01 октября 2019

Сортировка строки перед применением регулярного выражения:

const str = "abxbcxccdxdddexeeeefxfffffxx";

const res = [...str].sort().join('').match(/(.)\1*/g);

console.log(res);

Если вы абсолютно хотите, чтобы они были в таком порядке, вы можете выделить строку и сопоставить буквы по отдельности

const str = "abzzzbcxccdxdddexeeeefxfffffxx";

const res = [];

[...new Set(str)].forEach(letter => {
  const reg = new RegExp(`${letter}`, "g");
  res.push(str.match(reg).join(""));
});

console.log(res);
0 голосов
/ 02 октября 2019

Вот способ сделать это без регулярного выражения, но вам понадобится массив для хранения результатов:

var a = []; // (scratch space)
Array.prototype.map.call("abxbcxccdxdddexeeeefxfffffxx", c => c.charCodeAt(0))
  .forEach(n => a[n] ? a[n] += String.fromCharCode(n) : a[n] = String.fromCharCode(n));
console.log(a.join(''));

Outputs: "abbcccddddeeeeeffffffxxxxxxx"

И если вам это нужно по порядку, вы можете добавить m, чтобы сохранитьотображение позиций:

var a = [], m = []; // (scratch space; m maps chars to indexes)
Array.prototype.map.call("abxbcxccdxdddexeeeefxfffffxx", c => c.charCodeAt(0))
  .forEach(n => (!m[n]&&(m[n]=m.length), a[m[n]] ? a[m[n]] += String.fromCharCode(n) : a[m[n]] = String.fromCharCode(n)));
console.log(a.join(''));

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