删除所有单词的出现次数

3
我试图从文本中删除所有单词的出现。这些单词保存在数组中。
但是,我没有删除它们,而是收到了原始文本。
var text = "This is just a little test, to check if it works."
var words = ["this", "is", "a", "to", "if", "it"];

for (i = 0; i < words.length; i++) {
  text = text.replace(/words[i]/g, "")
}

alert(text); // result should be: just little test, check works.

这是一个小提琴(Fiddle)链接:https://fiddle.jshell.net/y07qgooq/

你不需要循环,这可以在单个正则表达式中完成。text.replace(new RegExp("\\b(" + words.join("|") + ")\\b", "ig"), "") - Tushar
3个回答

5
在你的代码中,words[i]不是被解释为JavaScript语言,而是被解释为正则表达式语言,只会匹配"wordsi"。 你可以按照以下方式编写你的正则表达式:
new RegExp("\\b" + words[i] + "\\b", "g")

我添加了 \b 单词边界,以确保删除的单词不是其他单词的一部分。

如果您想匹配前导的 "This",您还需要添加不区分大小写的标志 i

new RegExp("\\b" + words[i] + "\\b", "gi")

如果没有标点符号,使用以下替代方案会更加有效:
在 ES6 中:
text.split(" ").filter(word => words.indexOf(word) == -1).join(" ");

ES6之前:

text.split(" ").filter(function(word) { return words.indexOf(word) == -1; }).join(" ");

你实际上没有在RegExp的构造函数中指定 /,并且在 words [i] 之后缺少 concat。但除此之外,这可能是最完整的答案。 - CharlesLeaf
@CharlesLeaf,两个问题都已经解决了,一个是由OP解决的,另一个是我自己解决的,就在你发表评论的时候。感谢您的反馈! - Aaron
另外,ES6之前的解决方案对于单词“test”或“works”后面跟标点符号的情况无效:https://fiddle.jshell.net/27bd774j/3/ - Rick Hitchcock
@RickHitchcock 感谢您的反馈,我会在几分钟内检查如何修复所有问题。恐怕我无法修复没有正则表达式的解决方案:我可以按 \W 分割,但我不能使用相同字符进行合并。 - Aaron
1
@RickHitchcock 我修复了正则表达式的解决方案,需要双重转义单词边界。可运行的代码片段:https://fiddle.jshell.net/27bd774j/4/ - Aaron
显示剩余2条评论

2
你可以使用构造函数创建 RegExp
text = text.replace(new RegExp(words[i], "g"), "");

你可以像 @Aaron 建议的那样检查单词边界并忽略大小写。
new RegExp("\\b" + words[i] + "\\b ", "gi")

我只是进行了一个小测试,检查它是否有效。因此,即使“This”中的“is”也被删除了。 - Evgenij Reznik

1
因为你正在用空字符串替换实际文本words[i]。相反,你需要使用文本生成正则表达式。 text = text.replace(new RegExp(words[i], "g"), "")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接