如何在 Javascript 中映射替换字符,类似于 Perl 中的“tr”函数
How do you map-replace characters in Javascript similar to the 'tr' function in Perl?
我一直在试图弄清楚如何将字符串中的一组字符映射到另一组类似于Perl中的tr
函数。
我发现这个网站在JS和Perl中显示了等效的功能,但遗憾的是没有tr等效功能。
Perl 中的 tr
(音译(函数将字符一对一映射,因此
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($_);
另一种解决方案:
var data = data.replace(/[-_]/g, (match) => {
return '+/'['-_'.indexOf(match)];
});
对于第一个参数中正则表达式的每个匹配项,将调用 Replace 第二个参数中的函数,其返回值用作替换文本。
将所有a
映射到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 中,也可以写
tr{-_}{+/}
如
my %trans = (
'-' => '+',
'_' => '/',
);
my $class = join '', map quotemeta, keys(%trans);
my $re = qr/[$class]/;
s/($re)/$trans{$1}/g;
后一个版本肯定可以在JS中实现,没有太多麻烦。
(我的版本缺少Jonathan Lonowski解决方案的重复。
我想要一个允许传递自定义地图对象的函数,所以我根据 Jonathan Lonowski 的答案编写了一个。如果您尝试替换特殊字符(需要在正则表达式中转义的字符(,则必须做更多的工作。
const mapReplace = (str, map) => {
const matchStr = Object.keys(map).join('|');
if (!matchStr) return str;
const regexp = new RegExp(matchStr, 'g');
return str.replace(regexp, match => map[match]);
};
它是这样用的:
const map = { a: 'A', b: 'B', d: 'D' };
mapReplace('abcde_edcba', map);
// ABcDe_eDcBA
这是一个函数,它接收文本原始目标,并在文本中替换位于目标中相应位置的每个字符。
对于必须仅用一个字符替换多个字符的情况,反之亦然,Is 还不够好。从葡萄牙语文本中删除重音是不够的,这是我的用例。
function tr(text, orig, dest) {
console.assert(orig.length == dest.length);
const a = orig.split('').map(i=> new RegExp(i, 'g'));
const b = dest.split('');
return a.reduce((prev, curr, idx) => prev.replace(a[idx], b[idx]), text );
}
如何使用它:
var port = "ÀÂÃÁÉÊÍÓÔÕÜÚÇáàãâêéíóõôúüç";
var ascii = "AAAAEEIOOOUUCaaaaeeiooouuc";
console.log(tr("não têm ações em seqüência", port, ascii)) ;
Similiar to Jonathan Lonowski 回答,但有文字支持,而不仅仅是单个 tr 字符
"aaabbccddeeDDDffd".replace( /(a|cc|DDD|dd)/g, m => ({'a':'B', 'cc':'DDD', 'DDD':'ZZZ', dd:'QQ'}[m]) )
// RESULT: "BBBbbDDDQQeeZZZffd"
只有一个地图:
const map = {
'-': '+',
'_': '/'
};
data = Object.entries(map).reduce((prev, entry) => prev.replace(...entry), data);
- 无法从 jQuery RSS Feed 中的 localStorage 动态替换类
- 可以't让我的if语句处理js中的html表单输入
- 引用对象中的通用值
- 使用ActiveX读取PERL中的文件
- perl脚本中的javascript
- 如何最好地处理Web应用程序中的数据验证:纯JavaScript代码或对熟悉的perl包的ajax调用
- Perl 中的动态下拉列表
- 我可以比较两个Perl哈希(键和值)提取差异并应用于JavaScript中的哈希吗?
- 如何在 Javascript 中映射替换字符,类似于 Perl 中的“tr”函数
- Perl 和 HTML/JavaScript 中的特殊字符(非英语)
- BlackBerry WebWorks应用程序中的Perl脚本
- 如何使用perl中的WWW::Scripter模块设置referrer
- 如何使用perl中的WWW::Scripter模块显式清除cookie
- iso-8859-1中的perl utf8 encode向javascript utf8编码返回不同的结果
- 模拟perl'javascript中的md5_base64函数
- 将 HTML 页面中的 JavaScript 变量传递到 HTML 表单(在同一页面上)以提交给 Perl CGI
- 出现在perl生成的JavaScript代码中的数字,而不是"$("
- Javascript中的循环函数在与perl数组组合时失败
- 如何编写Perl脚本来提交JavaScript页面上另一个表单中的表单
- Perl中的chr()函数和JavaScript中的String.fromCharCode()函数