你如何映射替换Javascript中的字符类似于Perl中的'tr'函数?

qod*_*nja 35 javascript perl transliteration character-encoding

我一直试图弄清楚如何将字符串中的一组字符映射到另一个类似于trPerl中的函数的集合.

我发现这个站点显示了JS和Perl中的等效函数,但遗憾的是没有tr等价.

trPerl中的(音译)函数将字符一对一映射,所以

     data =~ tr|\-_|+/|;
Run Code Online (Sandbox Code Playgroud)

会映射

     - => + and _ => /
Run Code Online (Sandbox Code Playgroud)

如何在JavaScript中有效地完成这项工作?

Jon*_*ski 53

没有内置的等价物,但你可以接近一个replace:

data = data.replace(/[\-_]/g, function (m) {
    return {
        '-': '+',
        '_': '/'
    }[m];
});
Run Code Online (Sandbox Code Playgroud)

  • @qodeninja对象(`{...}`)定义字符映射,预期匹配为键/属性,替换为值.然后使用当前匹配`m`,从对象中查找自己的替换(`[m]`),然后将其返回到`replace`以执行实际替换. (2认同)
  • 不确定其性能,但将对象(“字典”)定义为全局变量可能会更快(避免每次重新创建)。 (2认同)

小智 6

我不能保证"有效",但这使用正则表达式和回调来提供替换字符.

function tr( text, search, replace ) {
    // Make the search string a regex.
    var regex = RegExp( '[' + search + ']', 'g' );
    var t = text.replace( regex, 
            function( chr ) {
                // Get the position of the found character in the search string.
                var ind = search.indexOf( chr );
                // Get the corresponding character from the replace string.
                var r = replace.charAt( ind );
                return r;
            } );
    return t;
}
Run Code Online (Sandbox Code Playgroud)

对于长字符串的搜索和替换字符,可能值得将它们放在哈希中并使函数从中返回.即,tr/abcd/QRST /成为散列{a:Q,b:R,c:S,d:T},并且回调返回散列[chr].


Pea*_*kJi 5

方法:

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];
    });
};
Run Code Online (Sandbox Code Playgroud)

一个完美的例子:

var s = "I think Peak rocks!"
s.mapReplace({"I think":"Actually","rocks":"sucks"})
// console: "Actually Peak sucks!"
Run Code Online (Sandbox Code Playgroud)

  • @qodeninja这是相同的技术,但是此方法允许使用动态JSON kv映射。它可能比答案要慢,因为它会为您生成正则表达式和替换字典。因此,在需要动态替换时使用此方法,如果仅需要处理静态单词集,请使用答案。 (2认同)