簡體   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