繁体   English   中英

如何替换字符串中的多个字符?

[英]How can I replace multiple characters in a string?

我想创建一个具有以下逻辑的正则表达式: 1.,如果字符串包含T用空格替换它 2.,如果字符串包含Z删除Z

我已经写了两个正则表达式,但我不能将它们组合起来:

string.replace(/\T/g,' ') && string.replace(/\Z/g,'');

编辑:我希望正则表达式代码更短

似乎这甚至不需要正则表达式。 只需 2 个链式替换即可。

 var str = '[T] and [Z] but not [T] and [Z]'; var result = str.replace('T',' ').replace('Z',''); console.log(result);

但是,简单的replace只替换第一次出现。
要全部替换,正则表达式仍然派上用场。 通过使用全局g标志。
请注意,字符不会使用\进行转义。 没有必要。

 var str = '[T] and [Z] and another [T] and [Z]'; var result = str.replace(/T/g,' ').replace(/Z/g,''); console.log(result); // By using regex we could also ignore lower/upper-case. (the i flag) // Also, if more than 1 letter needs replacement, a character class [] makes it simple. var str2 = '(t) or (Ⓣ) and (z) or (Ⓩ). But also uppercase (T) or (Z)'; var result2 = str2.replace(/[tⓉ]/gi,' ').replace(/[zⓏ]/gi,''); console.log(result2);

但是,如果目的是处理非常大的字符串,而性能很重要?
然后我在另一个挑战中发现,在 1 个正则表达式替换中使用未命名的回调函数可以证明更快。 与使用 2 个正则表达式替换相比。

可能是因为如果它只有 1 个正则表达式,那么它只需要处理一次巨大的字符串。

示例片段:

 console.time('creating big string'); var bigstring = 'TZ-'.repeat(2000000); console.timeEnd('creating big string'); console.log('bigstring length: '+bigstring.length); console.time('double replace big string'); var result1 = bigstring.replace(/[t]/gi,'X').replace(/[z]/gi,'Y'); console.timeEnd('double replace big string'); console.time('single replace big string'); var result2 = bigstring.replace(/([t])|([z])/gi, function(m, c1, c2){ if(c1) return 'X'; // if capture group 1 has something return 'Y'; }); console.timeEnd('single replace big string'); var smallstring = 'TZ-'.repeat(5000); console.log('smallstring length: '+smallstring.length); console.time('double replace small string'); var result3 = smallstring.replace(/T/g,'X').replace(/Z/g,'Y'); console.timeEnd('double replace small string'); console.time('single replace small string'); var result4 = smallstring.replace(/(T)|(Z)/g, function(m, c1, c2){ if(c1) return 'X'; return 'Y'; }); console.timeEnd('single replace small string');

你在寻找这样的东西吗?

ES6

var key = {
  'T': ' ',
  'Z': ''
}
"ATAZATA".replace(/[TZ]/g, (char) => key[char] || '');

香草

"ATAZATA".replace(/[TZ]/g,function (char) {return key[char] || ''});

或者

"ATAZATA".replace(/[TZ]/g,function (char) {return char==='T'?' ':''});

您可以捕获两者,然后决定在回调中做什么:

string.replace(/[TZ]/g,(m => m === 'T' ? '' : ' '));

 var string = 'AZorro Tab' var res = string.replace(/[TZ]/g,(m => m === 'T' ? '' : ' ')); console.log(res)

- 编辑 -

使用 dict 替换,您还可以执行以下操作:

 var string = 'AZorro Tab' var dict = { T : '', Z : ' '} var re = new RegExp(`[${ Object.keys(dict).join('') }]`,'g') var res = string.replace(re,(m => dict[m] ) ) console.log(res)

第二次更新

我开发了以下功能以在生产中使用,也许它可以帮助其他人。 它基本上是原生的replaceAll Javascript 函数的循环,它不使用正则表达式:

function replaceMultiple(text, characters){
  for (const [i, each] of characters.entries()) {
    const previousChar = Object.keys(each);
    const newChar = Object.values(each);

    text = text.replaceAll(previousChar, newChar);
  }  
  
return text
}

用法很简单:


const text = '#Please send_an_information_pack_to_the_following_address:';
const characters = [
    {
    "#":""
    },
   {
    "_":" "
    },
]

const result = replaceMultiple(text, characters);

console.log(result); //'Please send an information pack to the following address:'

更新

您现在可以本机使用replaceAll

过时的答案

这是另一个使用字符串原型的版本。 享受!

String.prototype.replaceAll = function(obj) {
    let finalString = '';
    let word = this;
    for (let each of word){
        for (const o in obj){
            const value = obj[o];
            if (each == o){
                each = value;
            }
        }
        finalString += each;
    }
    
    return finalString;
};

'abc'.replaceAll({'a':'x', 'b':'y'}); //"xyc"

暂无
暂无

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

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