【发布时间】:2016-08-31 16:02:00
【问题描述】:
我正在寻找一种方法来有效地(例如:使用尽可能少的资源)用 Javascript 中的其他字符串替换字符串。 重点是计算时间,而不是内存消耗。
搜索词和替换词作为字典对象给出
var replacements = {
search : 'replace',
another : 'replacement',
'and one' : 'more'
}
目前我正在遍历键并从中构建一个正则表达式(带有设置 g 标志),然后在字典中查找每个匹配项并替换它:
String.prototype.mapReplace = function (map, replaceFullOnly = false) {
var regexp = [];
for (var key in map) {
regexp.push(RegExp.escape(key));
}
regexp = regexp.join('|');
if (replaceFullOnly) {
regexp = '\\b(?:' + regexp + ')\\b';
}
regexp = new RegExp(regexp, 'gi');
return this.replace(regexp, function (match) {
return map[match.toLowerCase()];
});
}
这行得通,但是我每次都需要编译一个新的正则表达式。我的问题是:有人可以想出一种有效的方法来缓存常规表达式,如果相同的映射(与“相同的键”相同,既不是“相同的对象”,也不是“相同的值”,也不是“相同的键顺序”)再次给出,正则表达式是否被重用?
一种明显的方法是对键进行排序、序列化和散列,将其用作存储正则表达式的键,并在将来的调用中重新使用存储的正则表达式。但是,我认为这很可能比每次都编译一个新的常规表达式需要更多的时间......
想法/意见?
编辑:RegExp.escape() 是一个转义字符串中的特殊字符以用于正则表达式的函数:
RegExp.escape= function(s) {
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
};
使用信息:
- 替换做了很多,因为这是我在聊天系统中使用的
- 替换地图的更改很少见,但这取决于聊天操作员如何使用该功能。自动化脚本自动频繁地添加和删除替换规则是可能的。但是,对替换映射的更改总是比将替换映射应用于字符串的频率要低。
- 一个或多个替换地图可能同时使用并且彼此独立。
【问题讨论】:
-
你有一些例子吗,mapreplace 在做什么?
-
为什么不显式缓存已编译的正则表达式?只是不要每次都传递不同的地图对象。
-
@NinaScholz 用于聊天系统,操作员可以动态设置新的替换规则。存在针对不同用户的不同规则集。
-
@JohannesH。你是说你有一个从多个地方更新的全球
replacements地图?然后将其明确化,并将其封装在一个对象中。 -
@JohannesH.:是的,这种方法正是我所说的封装。您还可以向其添加测量代码。
标签: javascript string dictionary caching replace