替换字符串中所有出现的地方并避免 RegExp 转义
Replace all occurrences in a string and avoid RegExp escaping
是否可以在不损失性能的情况下,用另一个字符串替换所有出现的子字符串,并完全避免在整个过程中使用 RegExp? IE。从等式中删除 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
进行程序化转义会影响性能:
RegExp.quote = function(str) {
return (str+'').replace(/[.?*+^$[\]\(){}|-]/g, "\$&");
};
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。 自动转义字符时
您应该回顾一下您对 "escaping is a performance hit" 的看法。
如果你想要的是性能,那么使用正则表达式版本。
PS: Roel's version 比正则表达式更快。
或者,基于 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);
}
因为我在进行部分提取,所以它应该会获得更好的性能。
是否可以在不损失性能的情况下,用另一个字符串替换所有出现的子字符串,并完全避免在整个过程中使用 RegExp? IE。从等式中删除 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
进行程序化转义会影响性能:
RegExp.quote = function(str) {
return (str+'').replace(/[.?*+^$[\]\(){}|-]/g, "\$&");
};
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。 自动转义字符时
您应该回顾一下您对 "escaping is a performance hit" 的看法。
如果你想要的是性能,那么使用正则表达式版本。
PS: Roel's version 比正则表达式更快。
或者,基于 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);
}
因为我在进行部分提取,所以它应该会获得更好的性能。