1

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

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

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

这可能吗?谢谢

4

4 回答 4

3

您需要使用字符类。

var re = /[ùÙüÜäàáëèéïìíöòóüùúÄÀÁËÈÉÏÌÍÖÒÓÜÚñÑ]/g;

然后,您可以将函数作为第二个参数传递给该replace函数。该函数应包含转换逻辑。一种简单的方法是使用转换图。

例如

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

小提琴

于 2013-10-08T00:27:31.037 回答
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))

这个想法是遍历转换表的键,并将与该键的模式匹配的任何内容替换为键本身。这当然不是最有效的方法,但除非输入字符串相当长,否则它应该无关紧要。

于 2013-10-08T01:03:33.387 回答
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

在此处输入图像描述

于 2013-10-08T00:42:45.263 回答
0

我想不出比使用这个惊人的解决方案更简单的方法来有效地从字符串中删除所有变音符号。

看看它的实际效果:

var str = "ùÙüÜäàáëèéïìíöòóüùúÄÀÁËÈÉÏÌÍÖÒÓÜÚñÑ";

var str_norm = str.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
console.log(str_norm);

于 2018-08-16T10:09:24.067 回答