2017-02-05 38 views
2

我想寫一個正則表達式提取字符串中的所有重複字符。他們不需要連續。所以對於字符串abacb我想提取[a, b]正則表達式來提取所有重複字符

不幸的是,我只能想出方法,只給我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(/(\ w)的(?=。*?\ 1)/克)'將不能很好地一起工作''ABA \ NCB \ 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);