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

Javascript 替换字符串中的所有匹配项并避免RegExp转义,javascript,string,replace,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

在不损失性能的情况下,是否可以用另一个字符串替换所有出现的子字符串,并完全避免使用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, "\\$&");
};
这很有效。然而,使用正则表达式是否更有效?让我们试试看

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

function replaceAllRegex(str, search, replace) {
    return str.replace(new RegExp(search.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&"), 'g'), replace);
}
根据,非正则表达式版本的运算速度约为8k次/秒,而正则表达式版本的运算速度约为123k次/秒自动转义字符时。

你应该回顾一下你对“逃逸是一次性能打击”的看法

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

PS:可以比正则表达式快

这很有效。然而,使用正则表达式是否更有效?让我们试试看

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

function replaceAllRegex(str, search, replace) {
    return str.replace(new RegExp(search.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&"), 'g'), replace);
}
根据,非正则表达式版本的运算速度约为8k次/秒,而正则表达式版本的运算速度约为123k次/秒自动转义字符时。

你应该回顾一下你对“逃逸是一次性能打击”的看法

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


PS:可以比正则表达式快。

或者,根据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);
    }
因为我正在进行部分提取,所以它应该有更好的性能


或者,根据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);
    }
因为我正在进行部分提取,所以它应该有更好的性能


手动转义不需要时间(我的意思是它需要您的时间,但不需要CPU时间)。但是编程的unescape显然需要一些CPU时间。下面是相同的测试用例,但包括编程转义:
while(replace)
对我来说仍然慢32%。我想知道是否需要
indexOf()
。有没有办法知道
replace()
是否真的做了什么?@dystroy在答案中包括了它。@exebook没有,没有办法知道
replace
返回新字符串。手动转义不需要时间(我的意思是它需要您的时间,但不需要CPU时间)。但是编程的unescape显然需要一些CPU时间。下面是相同的测试用例,但包括编程转义:
while(replace)
对我来说仍然慢32%。我想知道是否需要
indexOf()
。有没有办法知道
replace()
是否真的做了什么?@dystroy在答案中包括了它。@exebook没有,没有办法知道
replace
返回新字符串。这一点很好,但仍取决于用例和运行时。但一般来说,正则表达式更好。但正如我们前面提到的,过早优化…加上一个,因为是的。。。在某些情况下,您的实现速度更快(正如Florian指出的,perf测试中有一个bug),这个建议的replaceQuick函数可能是在没有RegExp的情况下实现它的最好方法,因此从这个意义上讲,它最好地回答了OP问题。但是,除非您知道您运行的是一个缓慢的RegExp引擎,而且性能影响实际上很重要,否则为什么还要麻烦呢?如果您跨所有浏览器进行测试并使用各种实际输入,则RegExp可能会更快。这一点很好,但仍取决于用例和运行时。但一般来说,正则表达式更好。但正如我们前面提到的,过早优化…加上一个,因为是的。。。在某些情况下,您的实现速度更快(正如Florian指出的,perf测试中有一个bug),这个建议的replaceQuick函数可能是在没有RegExp的情况下实现它的最好方法,因此从这个意义上讲,它最好地回答了OP问题。但是,除非您知道您运行的是一个缓慢的RegExp引擎,而且性能影响实际上很重要,否则为什么还要麻烦呢?如果您跨所有浏览器进行测试并使用各种真实输入,RegExp可能会更快;此对话已结束。评论不用于扩展讨论;这段对话已经结束。