我一直在试图找出如何一组字符映射在一个串到另一组类似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】和回调返回散列[CHR]。
这将映射所有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('');
此功能,类似于它是如何用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,B)。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($_);
[...一个] .MAP((C,I)=> S(新正则表达式(C, “G”)中,b [1]));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($_);
在Perl中,人们也可以写
tr{-_}{+/}
如
my %trans = (
'-' => '+',
'_' => '/',
);
my $class = join '', map quotemeta, keys(%trans);
my $re = qr/[$class]/;
s/($re)/$trans{$1}/g;
这后一个版本可以肯定的JS实现没有太多的麻烦。
(我的版本缺少的乔纳森Lonowski的解决方案的重复。)