JS:在长文本中搜索一长串名称的最快方法?

时间:2017-12-23 22:12:26

标签: javascript html regex google-chrome-extension

我正在处理涉及替换字词的Chrome扩展程序。我想在任何给定的页面中查找大约6500个单词。

我使用regex表达式查找单词并替换它们,但速度太慢:平均新闻文章大约需要10秒。

是否有更有效的方法在大字符串中查找大量特定字词?

3 个答案:

答案 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

(另请注意使用单词边界进行的更改,以获得更快,更精简的正则表达式。)