私はきれいなRegExソリューションを探しています
単一のスペースで
自宅で遊んでいる人のために(以下は動作します)
text.replace(/[^a-z0-9]/gmi, " ").replace(/\s+/g, " ");
私の考えは、RegExはおそらく1つのステートメントでこれを達成するのに十分強力です。 idが必要だと思うコンポーネントは
[^a-z0-9]
-英数字以外の文字を削除します\s+
-スペースのコレクションに一致\r?\n|\r
-すべての新しい行に一致/gmi
-グローバル、複数行、大文字と小文字を区別しないただし、正しい方法で正規表現のスタイルを設定することはできないようです(以下は機能しません)
text.replace(/[^a-z0-9]|\s+|\r?\n|\r/gmi, " ");
入力
234&^%,Me,2 2013 1080p x264 5 1 BluRay
S01(*&asd 05
S1E5
1x05
1x5
望ましい出力
234 Me 2 2013 1080p x264 5 1 BluRay S01 asd 05 S1E5 1x05 1x5
\W
アンダースコアを残す に注意してください。 [^a-zA-Z0-9]
の短縮版は[\W_]
になります
text.replace(/[\W_]+/g," ");
\W
は、 略記\w
の否定です。[A-Za-z0-9_]
Word文字(アンダースコアを含む)
ジョニー5が私を打ち負かしました。 text.replace(/\W+/g, " ")
のように\W+
なしで\s
を使用することをお勧めします。これは空白もカバーします。
[^a-z0-9]
文字クラスにはalnum以外のすべてが含まれているため、白い文字も含まれています!
text.replace(/[^a-z0-9]+/gi, " ");
さて、各パターンに数量詞を追加する必要があると思います。また、キャリッジリターンは少しおかしいです:
text.replace(/[^a-z0-9]+|\s+/gmi, " ");
編集\s
は\r
と\n
にも一致します。
Aは、発音区別符号も付いた別の投稿を見ました。
s.replace(/[^a-zA-Z0-9À-ž\s]/g, "")
これは私の古い投稿であり、受け入れられた回答はほとんどの場合に適しています。しかし、私は各ソリューションともう1つの明らかなソリューションのベンチマークを行うことにしました(ただの楽しみのため)。異なるサイズの文字列を持つ異なるブラウザで正規表現パターンに違いがあるのではないかと思いました。
したがって、基本的には jsPerf onを使用しました
私がテストした正規表現パターンは
/[\W_]+/g
/[^a-z0-9]+/gi
/[^a-zA-Z0-9]+/g
ランダムな文字列の長さでそれらをロードしました
var newstr = str.replace(/[\W_]+/g," ");
を使用したJavaScriptの例
各実行は各正規表現で50以上のサンプルで構成され、各ブラウザーで5回実行しました。
馬を競いましょう!
結果
Chrome Edge
Chars Pattern Ops/Sec Deviation Op/Sec Deviation
------------------------------------------------------------------------
5,000 /[\W_]+/g 19,977.80 1.09 10,820.40 1.32
5,000 /[^a-z0-9]+/gi 19,901.60 1.49 10,902.00 1.20
5,000 /[^a-zA-Z0-9]+/g 19,559.40 1.96 10,916.80 1.13
------------------------------------------------------------------------
1,000 /[\W_]+/g 96,239.00 1.65 52,358.80 1.41
1,000 /[^a-z0-9]+/gi 97,584.40 1.18 52,105.00 1.60
1,000 /[^a-zA-Z0-9]+/g 96,965.80 1.10 51,864.60 1.76
------------------------------------------------------------------------
200 /[\W_]+/g 480,318.60 1.70 261,030.40 1.80
200 /[^a-z0-9]+/gi 476,177.80 2.01 261,751.60 1.96
200 /[^a-zA-Z0-9]+/g 486,423.00 0.80 258,774.20 2.15
真実は知られていますが、両方のブラウザーの正規表現(偏差を考慮に入れる)はほとんど区別できませんが、これをさらに何度も実行すると、結果はもう少し明確になります(しかし、それほどではありません)。
1文字の理論的なスケーリング
Chrome Edge
Chars Pattern Ops/Sec Scaled Op/Sec Scaled
------------------------------------------------------------------------
5,000 /[\W_]+/g 19,977.80 99,889,000 10,820.40 54,102,000
5,000 /[^a-z0-9]+/gi 19,901.60 99,508,000 10,902.00 54,510,000
5,000 /[^a-zA-Z0-9]+/g 19,559.40 97,797,000 10,916.80 54,584,000
------------------------------------------------------------------------
1,000 /[\W_]+/g 96,239.00 96,239,000 52,358.80 52,358,800
1,000 /[^a-z0-9]+/gi 97,584.40 97,584,400 52,105.00 52,105,000
1,000 /[^a-zA-Z0-9]+/g 96,965.80 96,965,800 51,864.60 51,864,600
------------------------------------------------------------------------
200 /[\W_]+/g 480,318.60 96,063,720 261,030.40 52,206,080
200 /[^a-z0-9]+/gi 476,177.80 95,235,560 261,751.60 52,350,320
200 /[^a-zA-Z0-9]+/g 486,423.00 97,284,600 258,774.20 51,754,840
これはそれほど大きな違いではないので、これらの結果にはあまり触れません。Edgeの方が遅いということが本当にわかるのです:o。さらに、私は非常に退屈していた。
とにかく、自分のベンチマークを実行できます。