RegExp:我想删除句子中不必要的单词。我该怎么做?

时间:2009-05-14 05:45:59

标签: javascript regex

我有一个句子,我想从中删除一些单词。

所以,如果我有:

"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”将从句子中删除。

我不打算这样做。

6 个答案:

答案 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”)共享相同的执行路径,直到它们不同的点。在你的情况下几乎没有必要,但很高兴知道。