2012-05-23 11 views
29

Bir dizedeki karakter kümesinin Perl'deki tr işlevine benzer şekilde başka bir kümeyle nasıl eşleneceğini bulmaya çalışıyorum.Perl'deki 'tr' işlevine benzer şekilde Javascript'teki karakterleri nasıl eşlersiniz?

this site that shows equivalent functions in JS and Perl'u buldum, ancak ne yazık ki hiçbir eşdeğeri yok.

Perl tr (çevirisi) işlevi böylece

 data =~ tr|\-_|+/|; 

bu JavaScript verimli yapılabilir Nasıl

 - => + and _ =>/

harita olur, karakterleri birebir eşler?

cevap

39

bir eşdeğeri yerleşik, ancak replace ile birine yakın alabilirsiniz:

data = data.replace(/[\-_]/g, function (m) { 
    return { 
     '-': '+', 
     '_': '/' 
    }[m]; 
}); 
+1

geri arama fonksiyonu ile çok güzel, ne dönüyor {..} [m] do? – qodeninja

+2

@qodeninja Nesne ('{...}') karakter eşleştirmeyi, beklenen eşleşmeleri anahtarlar/özellikler olarak değiştirir ve değerler olarak değiştirir. Mevcut eşleşme, daha sonra, gerçek değişimin yerine getirilmesi için "değiştir" e geri döndürülen nesneden kendi yedeğini ('[m]') aramaya kullanılır. –

+0

Görünüşe göre, cevap "evet" dir, ancak Perl kadar kısa bir öz değildir. –

3

Bu b tüm a s eşler ve tüm y DÜZENLEME

var map = { a: 'b', y: 'z' }; 
var str = 'ayayay'; 

for (var i = 0; i < str.length; i++) 
    str[i] = map[str[i]] || str[i]; 

z için:

Görünüşe dizeleriyle bunu yapamaz. İşte bir alternatiftir:

yoktur
var map = { a: 'b', y: 'z' }; 
var str = 'ayayay', str2 = []; 

for (var i = 0; i < str.length; i++) 
    str2.push(map[str[i]] || str[i]); 
str2.join(''); 
+0

Neden onu test ve neden düzenledikten sonra yerinde olmayan çalışma cevabı terk etmeden bir yanıt gönder? –

1

Perl, bir de

tr{-_}{+/} 
yazabilir

olarak
my %trans = (
    '-' => '+', 
    '_' => '/', 
); 

my $class = join '', map quotemeta, keys(%trans); 
my $re = qr/[$class]/; 

s/($re)/$trans{$1}/g; 

Bu ikinci sürüm kesinlikle JS'de çok fazla sorun olmadan uygulanabilir.

(My versiyonu Jonathan Lonowski çözümüyle tekrarını yoksundur.) Ben 'verimli' ama bu bir regex ve yedek karakterini sağlamak için bir geri arama kullanır kefil olamaz

5

.

Uzun arama dizeleri ve değiştirme karakterleri için, bunları bir karma haline getirmeye ve işlevden döndürmeye değer olabilir. yani, tr/abcd/QRST/hash olur {a: Q, b: R, c: S, d: T} ve geri dönüş, hash [chr] döndürür.

+1

+1, yine de: "]", "\" ve "^" desteklemiyor. Aralıkları desteklemiyor. "\" Çıkışını desteklemiyor. – ikegami

4

Yöntem:

String.prototype.mapReplace = function(map) { 
    var regex = []; 
    for(var key in map) 
     regex.push(key.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&")); 
    return this.replace(new RegExp(regex.join('|'),"g"),function(word){ 
     return map[word]; 
    }); 
}; 

mükemmel bir örnek:

var s = "I think Peak rocks!" 
s.mapReplace({"I think":"Actually","rocks":"sucks"}) 
// console: "Actually Peak sucks!" 
+0

Bu cevap ne kadar iyi? – qodeninja

+1

@qodeninja Aynı teknik, bu yöntem dinamik bir JSON kv haritalama kullanılmasına izin verirken. Yanıtdan daha yavaş olabilir, çünkü sizin için Regex ve yerine geçen sözlüğü üretir. Bu nedenle, dinamik değiştirmeye ihtiyaç duyduğunuzda bu yöntemi kullanın, sadece statik kelime kümesini kullanmanız gerekiyorsa, cevabı kullanın. – PeakJi

İlgili konular