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的混乱,这不是一个选项。