2017-02-05 2 views
2

Я пытаюсь написать регулярное выражение, которое извлекает все повторяющиеся символы в строке. Они не должны быть последовательными. Поэтому для строки abacb хочу извлечь [a, b].Regex для извлечения всех повторяющихся символов

К сожалению, я могу придумать методы, которые дают мне всего a. Нравится:

/(\w).+?(?:\1)/.exec('abacb'); 
    // Array [ "aba", "a" ] 

Вся помощь будет оценена!

ответ

5

Краткое решения с использованием String.prototype.match() функции с конкретным шаблоном регулярного выражения:

var str = 'abacb', 
 
    result = str.match(/(\w)(?=.*?\1)/g); 
 

 
console.log(result);

(\w) - первым захватив группу, содержащего повторяющийся характер

\1 - обратная ссылку на группу первого захвата (средства что некоторый символ повторяется)


Чтобы получить только уникальные совпавшие символы используют Array.prototype.filter() и Array.prototype.lastIndexOf() функции:

var str = 'aaaaabcbaa', 
 
    result = str.match(/(\w)(?=.*?\1)/gm); 
 

 
if (result) { 
 
    result = result.filter(function(c, i, a) { return i === a.lastIndexOf(c); }) 
 
} 
 
console.log(result);

Или Ecmascript6 подход с использованием Set объекта и spread operator:

var str = 'aaaaabcbaa', 
 
    result = str.match(/(\w)(?=.*?\1)/gm); 
 

 
if (result) { 
 
    result = [...new Set(result)]; 
 
} 
 
console.log(result);

+0

'.match (/ (\ ш) (? =. *? \ 1)/г)' не будет хорошо работать с ' 'аба \ НКТ \ n'' строка , –

+0

Ницца! Только 'str = 'aaa'' возвращает' [a, a] '. Но я могу проверить массив результатов для дубликатов. – Wannes

+0

@ WiktorStribiżew, не совсем уверен. В этом случае все пробелы следует рассматривать как '\ r \ t \ n \ ....' – RomanPerekhrest

1

Другой подход заключается в преобразовании строки в массив, а затем применить фильтр

var str='cabccb'; 
 
var arr=str.split(''); 
 
var duplicate_entry = arr.reduce(function(acc, el, i, arr1) { 
 
    if (arr1.indexOf(el) !== i && acc.indexOf(el) < 0) acc.push(el); return acc; 
 
}, []); 
 
console.log(duplicate_entry);

+0

Я должен сказать, что мне действительно нравится это решение! Благодаря! – Wannes

1

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

var string = "Lorem ipsum dolor sit amet ..."; 
 

 
var chars = {}; 
 

 
string.split("").forEach(function(chr) { 
 
    if (chars.hasOwnProperty(chr)) { 
 
    chars[chr]++; 
 
    } else { 
 
    chars[chr] = 1; 
 
    } 
 
}); 
 

 
console.log(Object.keys(chars)); 
 
console.log(chars);

Смежные вопросы