我一直在试图弄清楚如何将字符串中的一组字符映射到类似于tr
Perl 中的函数的另一组字符。
我发现这个站点显示了 JS 和 Perl 中的等效功能,但遗憾的是没有 tr 等效功能。
tr
Perl 中的(音译)函数将字符一一映射,所以
data =~ tr|\-_|+/|;
会映射
- => + and _ => /
如何在 JavaScript 中有效地做到这一点?
我一直在试图弄清楚如何将字符串中的一组字符映射到类似于tr
Perl 中的函数的另一组字符。
我发现这个站点显示了 JS 和 Perl 中的等效功能,但遗憾的是没有 tr 等效功能。
tr
Perl 中的(音译)函数将字符一一映射,所以
data =~ tr|\-_|+/|;
会映射
- => + and _ => /
如何在 JavaScript 中有效地做到这一点?
没有内置的等效项,但您可以通过以下方式接近一个replace
:
data = data.replace(/[\-_]/g, function (m) {
return {
'-': '+',
'_': '/'
}[m];
});
方法:
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];
});
};
一个完美的例子:
var s = "I think Peak rocks!"
s.mapReplace({"I think":"Actually","rocks":"sucks"})
// console: "Actually Peak sucks!"
我不能保证“高效”,但这使用正则表达式和回调来提供替换字符。
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;
}
对于长字符串的搜索和替换字符,可能值得将它们放入散列中并让函数从中返回。即,tr/abcd/QRST/ 成为散列 { a: Q, b: R, c: S, d: T } 并且回调返回 hash[ chr ]。
这个函数,类似于它在 Perl 中的构建方式。
function s(a, b){ $_ = $_.replace(a, b); }
function tr(a, b){ [...a].map((c, i) => s(new RegExp(c, "g"), b[i])); }
$_ = "Εμπεδοκλης ο Ακραγαντινος";
tr("ΑΒΓΔΕΖΗΘΙΚΛΜΝΟΠΡΣΤΥΦΧΩ", "ABGDEZITIKLMNOPRSTIFHO");
tr("αβγδεζηθικλμνοπρστυφχω", "abgdezitiklmnoprstifho");
s(/Ξ/g, "X"); s(/Ψ/g, "Ps");
s(/ξ/g, "x"); s(/ψ/g, "Ps");
s(/ς/g, "s");
console.log($_);
这会将所有a
s映射到b
和所有y
到z
var map = { a: 'b', y: 'z' };
var str = 'ayayay';
for (var i = 0; i < str.length; i++)
str[i] = map[str[i]] || str[i];
编辑:
显然你不能用字符串来做到这一点。这是一个替代方案:
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('');