替换字符串中所有出现的项并避免RegExp转义

Replace all occurrences in a string and avoid RegExp escaping

本文关键字:转义 RegExp 字符串 替换      更新时间:2024-06-19

在不损失性能的情况下,是否可以用另一个字符串替换所有出现的子字符串,并完全避免在此过程中使用RegExp?也就是说,将RegExp从等式中删除,只是为了确保当你忘记正确地逃离+之类的东西时,不会发生RegExp魔法。

'1+1 2+2'.replace('+', '-') -> only first "+" is replaced
'1+1 2+2'.replace(/'+/g, '-') -> undesired regexp complexities

更新1

这并不能解决逃跑问题:

String.prototype.replaceAll= function(search, replace) {
    return this.replace(new RegExp(search, "g"), replace);
}

更新2

做程序化的unescape在性能上大受欢迎:

RegExp.quote = function(str) {
    return (str+'').replace(/[.?*+^$[']''(){}|-]/g, "''$&");
};

或者,基于Florian Margaine的代码和测试用例:

    window.replaceQuick = function(subject, search, replace) {
      var index = -1, offset = 0;
      var result = '';
      while ((index = subject.indexOf(search, offset)) !== -1) {
        result += subject.substring(offset, index) + replace;
        offset = index + search.length;
      }
      return result + search.substring(offset);
    }

既然我在做部分提取,它应该会有更好的性能。

http://jsperf.com/replaceall-regex-or-not/3

function replaceAll(str, search, replace) {
    while (str.indexOf(search) > -1) {
        str = str.replace(search, replace);
    }
    return str;
}

这是有效的。然而,它是否比使用正则表达式更具性能?让我们试试。

以下是我基准测试的regex函数:

function replaceAllRegex(str, search, replace) {
    return str.replace(new RegExp(search.replace(/[.?*+^$[']''(){}|-]/g, "''$&"), 'g'), replace);
}

根据jsperf的说法,非正则表达式版本的运算速度约为8k运算/秒,而正则表达式版本则约为123k运算/秒自动转义字符时

你应该回顾一下你对"逃跑是一种成功的表现"的看法。

如果您想要的是性能,那么请使用regex版本。

附言:Roel的版本可能比regex更快。