2013-10-10 12 views
7

Düzenli ifadeler kullanarak bir dizeden tekrarlanan karakterleri kaldırmanın bir yolunu buldum.Regex bir dize tarafından tekrarlanan karakterleri kaldır javascript

function RemoveDuplicates() { 
    var str = "aaabbbccc"; 
    var filtered = str.replace(/[^\w\s]|(.)\1/gi, ""); 
    alert(filtered); 
} 

Çıktı: abc bu iyi çalışıyor.

Ancak, str = "aaabbbccccabbbbcccccc" ise çıkış abcabc olur. Sadece benzersiz karakterler almanın veya tüm kopyaların birini kaldırmanın bir yolu var mı? Herhangi bir yol varsa lütfen bana bildirin.

+0

sipariş önemli mi? Diğer bir deyişle, karakterin ilk ortaya çıkmasının kaydettiğiniz şey olması gerekli midir? –

+0

Yinelenenleri sildikten sonra karakterleri aynı sırada istiyorum. Sadece eşsiz olanı. –

cevap

22

Bir "şey tarafından takip edilen ve bu bu" gibi lookahead: regexes olmadan

var str = "aabbccxccbbaa"; 
str.replace(/(.)(?=.*\1)/g, ""); // "xcba" 

, koruyarak sırası: Bu her karakterin son oluşumunu koruduğunu

var str = "aaabbbccccabbbbcccccc"; 
str.replace(/(.)(?=.*\1)/g, ""); // "abc" 

Not:

var str = "aabbccxccbbaa"; 
str.split("").filter(function(x, n, s) { return s.indexOf(x) == n }).join(""); // "abcx" 
+0

Mike'a sordum ama henüz cevaplamadı. Sizin çözümünüzle gideceğim tek şeydir ve eğer düzeni korumanız gerekiyorsa, str.split (""). Ters(). ("") Hile yapmayın mı? Bu kodu çalıştırarak –

+1

... dize aynı sırada değil geliyor. eğer var str = "aaabbbcccaabbbcccaaaaaaaasa"; çıkış = "bcsa" ama abcs –

+0

@ Lindrian gibi bir şey istiyorum: evet, ya da http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript – georg

3

Bu eski bir görevdir. n, ancak ES6'da Sets'u kullanabiliriz. Kod şöyle görünür:

var test = 'aaabbbcccaabbbcccaaaaaaaasa'; 
 
var result = Array.from(new Set(test)).join(''); 
 

 
console.log(result);