0

文字列(テキスト)から「悪い」単語を削除するようにコードを書き込もうとしています。

その後にコンマまたは特別な記号が含まれている場合、その単語は「悪い」です。a to z(小文字)のみが含まれている場合、その単語は「悪い」ではありません。

したがって、私が達成しようとしている結果は次のとおりです。

<script>
String.prototype.azwords = function() {
   return this.replace(/[^a-z]+/g, "0");
}

var res = "good Remove remove1 remove, ### rem0ve? RemoVE gooood remove.".azwords();//should be "good gooood"
//Remove has a capital letter
//remove1 has 1
//remove, has comma
//###  has three #
//rem0ve? has 0 and ?
//RemoVE has R and V and E
//remove. has .
alert(res);//should alert "good gooood"
</script>
4

5 に答える 5

1

まず、同じプロパティをさまざまな方法で定義する可能性のある他のコードとの競合にさらされる可能性があるため、回避できる場合は、String(または任意のネイティブオブジェクト)のプロトタイプを変更することはお勧めしません。このようなカスタムメソッドを名前空間付きオブジェクトに配置する方がはるかに優れていますが、一部の人は同意しないと確信しています。

次に、RegExを完全に使用する必要がありますか?(本物の質問。面白くしようとしないでください。)

これは、あちこちで正規表現を少し使用した、昔ながらのJSを使用した関数の例ですコメント、デバッグ、および再利用が簡単です。

コードは次のとおりです。

var azwords = function(str) {
   var arr = str.split(/\s+/),
       len = arr.length,
       i = 0,
       res = "";
   for (i; i < len; i += 1) {
       if (!(arr[i].match(/[^a-z]/))) {
           res += (!res) ? arr[i] : " " + arr[i];
       }
   }
   return res;
}

var res = "good Remove remove1 remove, ### rem0ve? RemoVE gooood remove."; //should be "good gooood"

//Remove has a capital letter
//remove1 has 1
//remove, has comma
//###  has three #
//rem0ve? has 0 and ?
//RemoVE has R and V and E
//remove. has .

alert(azwords(res));//should alert "good gooood";
于 2013-01-31T11:23:21.893 に答える
1

\bさて、最初に、正規表現で境界エスケープという単語を使用することをお勧めします。また、悪い単語には小文字が含まれている可能性があるため、悪い単語と一致させるのは少し注意が必要です。現在の正規表現では、小文字の文字が含まれているものはすべて除外されます。

良い言葉を選んで、新しい文字列に入れたいと思います。はるかに簡単な正規表現です。

/\b[a-z]+\b/g

注意:文字列の最初と最後の単語で機能するかどうかは完全にはわかりません。そのため、それも考慮する必要があるかもしれません。http://www.regextester.com/は非常に便利です。

編集:単語の後の句読点を「悪い」にしたいので、これは実際に私が提案していたことを行います

(^|\s)[a-z]+(\s|$)
于 2013-01-31T11:03:36.590 に答える
1

これを試して:

return this.replace(/(^|\s+)[a-z]*[^a-z\s]\S*(?!\S)/g, "");

単語(空白/文字列の終わりで囲まれている)と一致しようとし、任意の(空白以外の)文字を含みますが、少なくとも1つはそうではありませんa-z。ただし、これは非常に複雑で保守不可能です。たぶん、もっと機能的なアプローチを試してみるべきでしょう:

return this.split(/\s+/).filter(function(word) {
    return word && !/[^a-z]/.test(word);
}).join(" ");
于 2013-01-31T11:05:17.520 に答える
1

これを試してください:

 var res = "good Remove remove1 remove, ### rem0ve? RemoVE gooood remove.";     
 var new_one = res.replace(/\s*\w*[#A-Z0-9,.?\\xA1-\\xFF]\w*/g,'');


//Output `good gooood`

説明

             \s*           # zero-or-more spaces
             \w*           # zero-or-more alphanumeric characters 
             [#A-Z0-9,.?\\xA1-\\xFF]  # matches any list of characters
             \w*           # zero-or-more alphanumeric characters

             /g  - global (run over all string) 
于 2013-01-31T11:12:37.930 に答える
0

これにより、必要なすべての単語/ ^ [az] + \ s | \ s [az] + $ | \ s [az] + \ s / gが検索されるため、matchを使用できます。

this.match(/^[a-z]+\s|\s[a-z]+$|\s[a-z]+\s/g).join(" ");有効な単語のリストを返す必要があります。

これはJSFiddleとして時間がかかるため、リストを分割して反復する方が効率的である可能性があることに注意してください。

于 2013-01-31T11:58:22.153 に答える