删除停用词

时间:2014-10-13 19:00:45

标签: javascript regex

我尝试使用单个.replace()从字符串中删除停用词,因为我发现它在this performance test中带来了最佳性能。但是,当两个停用词相互跟随时,我会遇到问题,例如下面的代码段:

var stopWordsRE = /((?:^|\s+?)(foo|bar)(?:$|\s+?))/gi;
var text = "foo bar baz bar foobar";
var filtered = text.replace(stopWordsRE, " ");
console.log(filtered); // bar baz foobar

但它应该回归:

baz foobar

问题是正则表达式匹配foo和后续空格,以便bar不再有前面的空格来匹配。我认为非捕获组就足够了,因此不会记住空白。但显然不是,你能告诉我如何修复正则表达式,使它匹配彼此之后的停用词吗?

2 个答案:

答案 0 :(得分:2)

尝试使用字边界进行匹配:\b

var stopWordsRE = /(\b(foo|bar)\b\s*)/gi;

在行(g标志)上多次匹配,不区分大小写(i标志),就像您已经拥有的那样。

它匹配任何foobar这个完整的单词。也就是说,字符串的两端都以word boundaries为界,它们是对应单词开头或结尾的零长度锚点。

最后,\s*抓住单词旁边的任何(或没有)空格,这样你就不会在剩下的单词之间留下多个空格。

答案 1 :(得分:2)

您需要使用正向前瞻,而不是匹配foo or bar之后的空格:

var stopWordsRE = /(?:^|\s+)(?:foo|bar)(?=\s+|$)/gi;
var filtered = text.replace(stopWordsRE, "").trim();
//=> "baz foobar"