是否可以在js中使用正则表达式来替换几个不同的字符?

时间:2013-10-08 00:18:23

标签: javascript regex

我需要用它的非重音版本替换字符串中的所有重音字符,以便进行排序。 我找到了如何匹配重音的,但是可以使用正则表达式替换每一个吗? 我的意思是:

var re = /ùÙüÜäàáëèéïìíöòóüùúÄÀÁËÈÉÏÌÍÖÒÓÜÚñÑ/g;
var str = "ùÙüÜäàáëèéïìíöòóüùúÄÀÁËÈÉÏÌÍÖÒÓÜÚñÑ";
var newstr = str.replace(re, 'M');
console.log(newstr);

这打印'M' 但我需要:'uUuUaaaeeeiiiooouuuAAAEEEIIIOOOUUnN'

这可能吗? 感谢

4 个答案:

答案 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ÚñÑ

FIDDLE

答案 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

enter image description here

答案 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);

希望有帮助。