我有一个句子,我想从中删除一些单词。
所以,如果我有:
"jQuery is a Unique language"
和一个名为garbageStrings的数组:
var garbageStrings = ['of', 'the', "in", "on", "at", "to", "a", "is"];
我想删除句子中的“是”和“a”。
但是如果我使用它:/这个语句在for循环中。我循环整个句子并在garbageStrings /
中找到匹配项var regexp = new RegExp(garbageStrings[i]);
字符串将变为“jQuery Unique lnguge”
请注意,语句中的“a”将从句子中删除。
我不打算这样做。
答案 0 :(得分:12)
这样的事情:
function keyword(s) {
var words = ['of', 'the', 'in', 'on', 'at', 'to', 'a', 'is'];
var re = new RegExp('\\b(' + words.join('|') + ')\\b', 'g');
return (s || '').replace(re, '').replace(/[ ]{2,}/, ' ');
}
答案 1 :(得分:4)
我可以发誓JavaScript有\b
(字边界),但它看起来没有,请尝试这样做:
var regex = new RegExp("( |^)" + "a" + "( |$)", "g");
var string = "I saw a big cat, it had a tail.";
string = string.replace(regex, "$1$2");
答案 2 :(得分:3)
首先,如果你要遍历每种可能类型的“garbageString”,那么完全没必要使用Regex。
其次,您应该尝试搜索“仅限整个单词”。这意味着只有在垃圾字符串前面跟着一个字符分隔符(例如示例中的空格)时才匹配它。如果实现这一点,基于正则表达式的匹配将变得有用。
如果有任何标点符号,此代码不起作用,但根据您的需要更改代码应该不会太难。
var text = "jQuery is a Unique language";
var garbageStrings = {"of": true,
"the": true,
"in": true,
"on": true,
"at": true,
"to": true,
"a": true,
"is": true};
var words = text.split(" ");
var newWords = Array()
for (var i = 0; i < words.length; i++) {
if (typeof(garbageStrings[words[i]]) == "undefined") {
newWords.push(words[i]);
}
}
text = newWords.join(" ");
答案 3 :(得分:0)
首先,您需要为此使用数组,而不是正则表达式,因为它们会更快。正则表达式的数量级更复杂,因此太重了。正如阿特伍德所说,程序员认为他可以解决正则表达式的问题。然后他有两个问题。
所以,一个快速实现,使用你的垃圾字符串列表,并完成工作,利用javascript的内置字典速度来检查一个单词是否是垃圾,并在下面给出处理标点符号。有a little test page你可以尝试一下。
function splitwords(str) {
var unpunctuated = unpunctuate(str);
var splitted = unpunctuated.split(" ");
return splitted;
}
function unpunctuate(str) {
var punctuation = ['.', ',', ';', ':', '-'];
var unpunctuated = str;
for(punctidx in punctuation) {
punct = punctuation[punctidx];
// this line removes punctuation. to keep it, swap in the line below.
//unpunctuated = unpunctuated.replace(punct," "+punct+" ");
unpunctuated = unpunctuated.replace(punct,"");
}
return unpunctuated;
}
var garbageStrings = ['of', 'the', "in", "on", "at", "to", "a", "is"];
var garbagedict= {};
for(garbstr in garbageStrings) {
garbagedict[garbageStrings[garbstr]] = 1;
}
function remove(str) {
words = splitwords(str);
keeps = [];
for(wordidx in words) {
word = words[wordidx];
if(word in garbagedict) {
// ignore
} else {
keeps.push(word);
}
}
return keeps.join(" ");
}
答案 4 :(得分:0)
请不要使用RegExp,这是脏的和不必要的,并且占用太多周期。更容易:
var garbageStrings = ['of', 'the', "in", "on", "at", "to", "a", "is"];
for(var i=0; i < garbageString.length; i++){
string.replace(" "+garbageStrings[i]+" ", "");
}
或使用数组:
var garbageStrings = ['of', 'the', "in", "on", "at", "to", "a", "is"];
var str = str.split(" ");
for(var i=0; i < garbageStrings.length; i++){
for(var j=0; j < str.length; j++){
if(str[j].toLowerCase() === garbageStrings[i]){
str.splice(j, 1);
}
}
}
str = str.join(" ");
答案 5 :(得分:0)
除了我将删除空格作为正则表达式本身的一部分,而不是使用第二个正则表达式(为了更好的性能):
var re = new RegExp("\\b(?:"+ words.join("|") + ")\\b\\s*", "gi");
s.replace(re, "");
正则表达式将在对象创建时编译。在重复操作时,它不应该明显慢于使用字符串/数组操作循环遍历每个停用词,并且它更容易掌握。
如果您只有一个简短的静态停用词列表,那么您可以编写自己的优化正则表达式:
var re = new RegExp("\\b(?:at?|i[ns]|o[fn]|t(?:he|o))\\b\\s*", "gi");
"jQuery is a Unique language".replace(re, "");
这里的想法是共享相同前缀的词(例如“of”和“on”)共享相同的执行路径,直到它们不同的点。在你的情况下几乎没有必要,但很高兴知道。