我正在处理涉及替换字词的Chrome扩展程序。我想在任何给定的页面中查找大约6500个单词。
我使用regex
表达式查找单词并替换它们,但速度太慢:平均新闻文章大约需要10秒。
是否有更有效的方法在大字符串中查找大量特定字词?
答案 0 :(得分:0)
我认为你试图立刻实现太多。如果你有一个大型模式与垂直条/管道|
有很多交替,你的模式会变慢,因为正则表达式引擎必须回溯很多。
因此,我建议换链。
Here是两个可以使用的ReplaceAll候选人:
//Regular Expression Based Implementation
String.prototype.replaceAll = function(search, replacement) {
var target = this;
return target.replace(new RegExp(search, 'g'), replacement);
};
//Split and Join (Functional) Implementation
String.prototype.replaceAll2 = function(search, replacement) {
var target = this;
return target.split(search).join(replacement);
};
var t0 = performance.now();
//your Approach
var t1 = performance.now();
console.log("Call to doSomething took " + (t1 - t0) + " milliseconds.")
var t0 = performance.now();
str.replaceAll('Erica', 'Example');
//...
var t1 = performance.now();
console.log("Call to doSomething took " + (t1 - t0) + " milliseconds.")
var t0 = performance.now();
str.replaceAll2('Erica', 'Example');
//...
var t1 = performance.now();
答案 1 :(得分:0)
查找单词匹配的最快方法是使用正则表达式和字符串解析。例如,我们必须在大文本中找到电子邮件地址列表。使用正则表达式,系统会尝试匹配地址的本地部分,即@
字符之前,然后是域名。这很难找到。相反,您可以遍历所有文本,查找@
个字符,然后使用regexp检查语法是否正确。
答案 2 :(得分:0)
一种简单的方法可以提高正则表达式的效率,这是为了防止它直接检查以小写字母开头的单词。首先搜索单词边界和大写字母,然后在名称列表中删除每个单词的第一个字母。使用your example,这就是你的正则表达式:
\b[A-Z](rica|ary|essica)\b
(另请注意使用单词边界进行的更改,以获得更快,更精简的正则表达式。)