我正在尝试编写一个提取字符串中所有重复字符的正则表达式。他们不需要连续。因此,对于字符串abacb
,我想要提取[a, b]
。
不幸的是,我只能提出一些只给我a
的方法。像:
/(\w).+?(?:\1)/.exec('abacb');
// Array [ "aba", "a" ]
所有帮助将不胜感激!
答案 0 :(得分: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);

使用Set对象和 spread operator 的
或 Ecmascript6 方法:
var str = 'aaaaabcbaa',
result = str.match(/(\w)(?=.*?\1)/gm);
if (result) {
result = [...new Set(result)];
}
console.log(result);

答案 1 :(得分: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);
答案 2 :(得分:1)
您可以将字符存储在对象中,甚至可以计算每个字符出现的次数。
plugin -install lmenezes/elasticsearch-kopf