我尝试使用单个.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
不再有前面的空格来匹配。我认为非捕获组就足够了,因此不会记住空白。但显然不是,你能告诉我如何修复正则表达式,使它匹配彼此之后的停用词吗?
答案 0 :(得分:2)
尝试使用字边界进行匹配:\b
var stopWordsRE = /(\b(foo|bar)\b\s*)/gi;
在行(g
标志)上多次匹配,不区分大小写(i
标志),就像您已经拥有的那样。
它匹配任何foo
或bar
这个完整的单词。也就是说,字符串的两端都以word boundaries为界,它们是对应单词开头或结尾的零长度锚点。
最后,\s*
抓住单词旁边的任何(或没有)空格,这样你就不会在剩下的单词之间留下多个空格。
答案 1 :(得分:2)
您需要使用正向前瞻,而不是匹配foo or bar
之后的空格:
var stopWordsRE = /(?:^|\s+)(?:foo|bar)(?=\s+|$)/gi;
var filtered = text.replace(stopWordsRE, "").trim();
//=> "baz foobar"