替换字符串中所有出现的项并避免RegExp转义
Replace all occurrences in a string and avoid RegExp escaping
在不损失性能的情况下,是否可以用另一个字符串替换所有出现的子字符串,并完全避免在此过程中使用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更快。
相关文章:
- 在JavaScript中输出转义字符
- 转义符不能与innerHTML一起使用
- RegExp:匹配Javascript中除regex值之外的所有内容
- Rails 3.2 js.erb文件转义js
- JavaScript正则表达式文本与RegExp对象
- 使用RegExp查找url中的字符
- 相同的RegExp返回不同的结果-第一次是正确的结果,第二次是null
- 转义在jsp's脚本
- 全局标志仅与第一个匹配项匹配的Regexp
- javascript RegExp的奇怪行为:相同的正则表达式会产生不同的结果
- 替换字符串中所有出现的项并避免RegExp转义
- 在RegExp中使用带有转义符的变量
- JavaScript Regexp 用于删除 JSON 中转义的反斜杠和引号
- Javascript:转义 RegExp 字符串中的字符问题
- 如何转义RegExp对象中使用的字符串
- 替换一个转义字符,javascript, regexp
- 如何在regexp中转义星号
- 转义字符串用于高亮显示函数时出错(js -regexp)
- RegExp关键字正在转义
- 如何在lodash模板中设置自定义转义RegExp