【问题标题】:How can I replace multiple characters in a string?如何替换字符串中的多个字符?
【发布时间】:2017-06-02 09:03:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么需要合并?只需使用var res = string.replace(/\T/g,' ').replace(/\Z/g,'');
  • @VadimB 我可以看到 2 个可能的原因:1:OP 希望正则表达式代码更短,2:OP 希望将正则表达式存储在一个对象或正则表达式列表中
  • @nickzoum 更短

标签: javascript regex


【解决方案1】:

似乎这甚至不需要正则表达式。只需 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);

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

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

示例 sn-p:

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

【讨论】:

  • 也可能更高效
  • replace(string) 只替换一次。试试[T] and [Z] and more [Z]
  • @georg 是的,所以我已将这一见解添加到答案中。谢谢。
【解决方案2】:

你在寻找这样的东西吗?

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'?' ':''});

【讨论】:

  • 这是最简洁的,对我来说非常适合 ES6 语法。谢谢!
【解决方案3】:

您可以创建一个自定义函数来替换您需要的所有字符:

const replaceAll = (text, obj) => {
    return [...text].map(each => {
        for (const o in obj){
            (each == o) ? each = obj[o] : o;
        }
        return each;
    }).join('');
};

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

这是使用string.prototype的另一种选择:

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"

【讨论】:

    【解决方案4】:

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

    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)

    【讨论】:

    • 您也可以考虑替换字典,如{T: ' ', Z: ''} 然后m => replacements[m]
    • 请记住,如果这是针对网络的IE doesn't support arrow functions
    • @Liam 你说的是真的,但可读性方面 es6 看起来好多了
    猜你喜欢
    • 2011-09-01
    • 2022-01-03
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多