web-dev-qa-db-ja.com

すべての非英数字、改行、および複数の空白を1つのスペースに置き換えます

私はきれいな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
109
TheGeneral

\Wアンダースコアを残す に注意してください。 [^a-zA-Z0-9]の短縮版は[\W_]になります

text.replace(/[\W_]+/g," ");

\Wは、 略記\wの否定です。[A-Za-z0-9_] Word文字(アンダースコアを含む)

regex101.comの例

176
Jonny 5

ジョニー5が私を打ち負かしました。 text.replace(/\W+/g, " ")のように\W+なしで\sを使用することをお勧めします。これは空白もカバーします。

138
T-CatSan

[^a-z0-9]文字クラスにはalnum以外のすべてが含まれているため、白い文字も含まれています!

 text.replace(/[^a-z0-9]+/gi, " ");
11

さて、各パターンに数量詞を追加する必要があると思います。また、キャリッジリターンは少しおかしいです:

text.replace(/[^a-z0-9]+|\s+/gmi, " ");

編集\s\r\nにも一致します。

5
Pointy

Aは、発音区別符号も付いた別の投稿を見ました。

s.replace(/[^a-zA-Z0-9À-ž\s]/g, "")

2
Dmitri R117

これは私の古い投稿であり、受け入れられた回答はほとんどの場合に適しています。しかし、私は各ソリューションともう1つの明らかなソリューションのベンチマークを行うことにしました(ただの楽しみのため)。異なるサイズの文字列を持つ異なるブラウザで正規表現パターンに違いがあるのではないかと思いました。

したがって、基本的には jsPerf onを使用しました

  • Chrome 65.0.3325/Windows 10 0.0.0でのテスト
  • Edge 16.16299.0/Windows 10 0.0.0でのテスト

私がテストした正規表現パターンは

  • /[\W_]+/g
  • /[^a-z0-9]+/gi
  • /[^a-zA-Z0-9]+/g

ランダムな文字列の長さでそれらをロードしました

  • 長さ5000
  • 長さ1000
  • 長さ200

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。さらに、私は非常に退屈していた。

とにかく、自分のベンチマークを実行できます。

Jsperf Benchmark here

1
TheGeneral