我需要用它的非重音版本替换字符串中的所有重音字符,以便进行排序。 我找到了如何匹配重音的,但是可以使用正则表达式替换每一个吗? 我的意思是:
var re = /ùÙüÜäàáëèéïìíöòóüùúÄÀÁËÈÉÏÌÍÖÒÓÜÚñÑ/g;
var str = "ùÙüÜäàáëèéïìíöòóüùúÄÀÁËÈÉÏÌÍÖÒÓÜÚñÑ";
var newstr = str.replace(re, 'M');
console.log(newstr);
这打印'M' 但我需要:'uUuUaaaeeeiiiooouuuAAAEEEIIIOOOUUnN'
这可能吗? 感谢
答案 0 :(得分:3)
您需要使用字符类。
var re = /[ùÙüÜäàáëèéïìíöòóüùúÄÀÁËÈÉÏÌÍÖÒÓÜÚñÑ]/g;
然后,您可以将函数作为第二个参数传递给replace
函数。该函数应包含转换逻辑。一种简单的方法是使用转换图。
E.g。
var re = /[ùÙüÜäàáëèéïìíöòóüùúÄÀÁËÈÉÏÌÍÖÒÓÜÚñÑ]/g;
//incomplete but you get the idea
var conversionMap = {
'ù': 'u',
'Ù': 'U',
'ü': 'u',
'Ü': 'U',
'ä': 'a'
};
"ùÙüÜäàáëèéïìíöòóüùúÄÀÁËÈÉÏÌÍÖÒÓÜÚñÑ".replace(re, function (c) {
return conversionMap[c] || c;
}); //uUuUaàáëèéïìíöòóuuúÄÀÁËÈÉÏÌÍÖÒÓUÚñÑ
答案 1 :(得分:1)
http://jsfiddle.net/Victornpb/YPtaN/4
var deaccentuate = (function(){
var accent = "ùÙüÜäàáëèéïìíöòóüùúÄÀÁËÈÉÏÌÍÖÒÓÜÚñÑ",
latin = "uUuUaaaeeeiiiooouuuAAAEEEIIIOOOUUnN".split("");
var re = new RegExp("["+accent+"]", "g");
return function(str){
return str.replace(re, function(c){
return latin[accent.indexOf(c)]; }
);
}
})();
deaccentuate("Olá, como estás?"); //Ola, como estas?
我实现了一个带有2KB文本的基准测试,我的功能比其他答案更快,达到59000 Ops / sec
http://jsperf.com/deaccentuate
答案 2 :(得分:1)
这是相当冗长的,以便可读。 (好吧,无论如何,对每一个人来说都是如此。)
var deaccentuate = (function() {
var conversion =
{ 'a' : /[äàá]/g
, 'e' : /[ëèé]/g
, 'i' : /[ïìí]/g
, 'o' : /[öòó]/g
, 'u' : /[üùú]/g
, 'n' : /ñ/g
, 'A' : /[ÄÀÁ]/g
, 'E' : /[ËÈÉ]/g
, 'I' : /[ÏÌÍ]/g
, 'O' : /[ÖÒÓ]/g
, 'U' : /[ÜÙÚ]/g
, 'N' : /Ñ/g
}
return function(str) {
return Object.keys(conversion).reduce(function(str, c) {
return str.replace(conversion[c], c)
}, str)
}
}())
用法:(http://jsbin.com/UFEbuho/1/)
var input = "ùÙüÜäàáëèéïìíöòóüùúÄÀÁËÈÉÏÌÍÖÒÓÜÚñÑ"
console.log(deaccentuate(input))
我们的想法是遍历转换表的键,并将与该键的模式匹配的任何内容替换为键本身。这当然不是最有效的方法,但除非输入字符串相当长,否则不应该太重要。
答案 3 :(得分:0)
我想不出比使用此amazing solution更简单的方法来有效地删除字符串中的所有变音符号。
查看实际效果:
var str = "ùÙüÜäàáëèéïìíöòóüùúÄÀÁËÈÉÏÌÍÖÒÓÜÚñÑ";
var str_norm = str.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
console.log(str_norm);
希望有帮助。