替换字符串中的所有匹配项并避免RegEx转义

时间:2015-02-26 10:02:32

标签: javascript string replace

是否可以在不损失性能的情况下用另一个字符串替换所有出现的子字符串,并完全避免沿途使用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, "\\$&");
};

2 个答案:

答案 0 :(得分:3)

或者,基于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

答案 1 :(得分:1)

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

这很有效。但是,使用正则表达式更高效吗?我们来试试吧。

以下是我对其进行基准测试的正则表达式函数:

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

根据jsperf,非正则表达式的版本大约为8k ops / sec,而正则表达式的版本大约为123k ops / sec。 自动转义字符时。

你应该检查你的观点"逃避是一次性能打击"。

如果您想要的是性能,请使用正则表达式版本。

PS:Roel's version可能比正则表达式快。