繁体   English   中英

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

[英]is it possible to use regex in js to replace several different chars?

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

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

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

这可能吗? 谢谢

您需要使用字符类。

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

小提琴

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

在此处输入图片说明

为了便于阅读,这非常冗长。 (不管怎么说,每个人自己。)

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))

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

与使用这种惊人的解决方案相比,我想不到一种更有效地从字符串中删除所有变音符的简便方法。

实际观看:

 var str = "ùÙüÜäàáëèéïìíöòóüùúÄÀÁËÈÉÏÌÍÖÒÓÜÚñÑ"; var str_norm = str.normalize('NFD').replace(/[\̀-\ͯ]/g, ''); console.log(str_norm); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM