2009-05-14 13 views
6

私は文を持っており、それからいくつかの言葉を削除したい。RegExp:文章内の不要な単語を削除したい。どうしたらいいですか?

は、だから私は持っている場合:

"jQuery is a Unique language" 

とgarbageStringsという名前の配列:

var garbageStrings = ['of', 'the', "in", "on", "at", "to", "a", "is"]; 

は、私が "ある" と "" の文で削除したいです。

私はthisを使用しています:/このステートメントはforループ内にあります。私は文章全体をループし、文字列は「」言語の文から削除されていることを「jQueryのユニークlnguge」

お知らせとなります

var regexp = new RegExp(garbageStrings[i]); 

garbageStringsで試合を/見つけることです。

私はそれが起こるつもりはありませんでした。

+0

@Chas:提示された構文とRegexpオブジェクトはJavascriptに固有のものだと私は理解していますが、OPがそれを完全には言及していないので、言語タグを変更することが予想されます。 – Cerebrus

+1

@Keira:あなたの名前が私を笑わせてくれるから+1! – Cerebrus

+0

@Cerebrusそれが間違っていると、OPはそれを元に戻すことができますが、これはより大きなオーディエンスに質問を出します。言語にとらわれないようにする必要がある場合、OPはそれを言語にとらわれないものとしてマークする必要があります。 –

答えて

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"); 
+0

私はこれを試しましたが、うまくいきませんでした –

3

ファースト"garbageString"のうち、Regexを使うのはまったく必要ありません。

第2に、おそらく "単語全体のみ"を検索しようとしているはずです。これは、単語の区切り文字(例では空白など)が前に続いている場合にのみ、ガベージ文字列と一致することを意味します。これを実装すると、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(" "); 
+0

@gs:編集をありがとう! :-) – Cerebrus

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,}/, ' '); 
} 
+3

+1、しかし、私はすべてのこれらの単語を読みやすくするために配列に入れて、正規表現に入れるには.join( '|')を使用します。 – nickf

+0

また、スクイズ正規表現を洗練された。 – wombleton

+1

スペースは単語境界であるだけでなく、 '\ W'クラスの文字であることに注意してください。だからハイフンも。 – Gumbo

0

まず、あなたは彼らが速くなりますので、正規表現ではない、このために配列を使用する必要があります。正規表現はより複雑で、したがって重すぎます。 Atwood氏は、プログラマは正規表現の問題を解決できると考えています。それから彼には2つの問題があります。

ガベージ文字列のリストを使用して、単語がゴミであるかどうかをチェックしたり、句読点を処理したりするために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(" "); 
} 
+0

アトウッドはその引用符で終わっていませんでした。 http://ja.wikipedia.org/wiki/Jamie_Zawinski –

+0

AtwoodはRegexを愛していますか?私はそれをソースで見た場合、2番目のコードを削除します。 –

+0

@Chad:それでは、より良いものを提供してください。 @Paulo:Atwoodから聞いたことがありますが、それは引用ではありません。 このコードのポイントは、OPが何をしたいのかということです。正規表現はパターンマッチングには最適ですが、これはパターンマッチングではありません。それは簡単な言葉の比較です。ここでシンプルな方がいいですね。 –

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(" "); 
0

wombleton等が述べています。;)

私は正規表現自体の一部として空白を削除ではなく、この()パフォーマンス向上のためのための第二の正規表現を使用する場合を除き:

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, ""); 

ここでの考え方は、上の「と「の」同じプレフィックスを共有する言葉(たとえば、 ")は、それらが異なるポイントまで同じ実行パスを共有します。あなたのケースではほとんど必要ありませんが、知っていいです。