Javascript 删除停止词

Javascript 删除停止词,javascript,regex,Javascript,Regex,我正试图用一个.replace()从字符串中删除停止字,因为我发现它能带来最好的性能。但当两个停止词紧跟在一起时,我会遇到一些问题,如下面的片段: var stopWordsRE = /((?:^|\s+?)(foo|bar)(?:$|\s+?))/gi; var text = "foo bar baz bar foobar"; var filtered = text.replace(stopWordsRE, " "); console.log(filtered); // bar baz foo

我正试图用一个
.replace()
从字符串中删除停止字,因为我发现它能带来最好的性能。但当两个停止词紧跟在一起时,我会遇到一些问题,如下面的片段:

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
就不再需要匹配前面的空格了。我认为非捕获组就足够了,这样空白就不会被记住了。但显然不是,你能告诉我如何修复正则表达式,使它匹配紧跟其后的stopwords吗

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

var stopWordsRE = /(\b(foo|bar)\b\s*)/gi;
它在行中多次匹配(
g
flag),不区分大小写(
i
flag),正如您之前所做的那样

它匹配任何一个完整单词的
foo
bar
。也就是说,字符串的两端都以为边界,这是与单词的开头或结尾相对应的零长度锚点


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

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

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

这似乎是一个家庭作业问题。我可以向你保证,它不是。但是如果答案很简单或者很明显,我道歉…@rob,这看起来不像是家庭作业问题。即使是这样,你也比来这里的大多数人做得更多,他们带着一个家庭作业问题要求解决你的预期结果是什么?预期结果就在这个问题上:
baz foobar
这确实解决了问题,也是一种改进。但它似乎与德国乌姆劳特有麻烦。它与
häbar
中的
bar
匹配。至少在Chrome中是这样,但这也可能是V8中的一个bug。也将在其他浏览器中测试它。@rob Good point。看,我更喜欢这个解决方案,但由于目前JS和unicode的混乱,这不是一个选项。