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


136

交換するためのきちんとした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

あなたの試みはどの程度正確に機能しませんか?何がうまくいかないのですか?
2014年

回答:


235

\W アンダースコア残ることに注意してください。以下のための短い同等[^a-zA-Z0-9]になります[\W_]

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

\W否定である速記 \w[A-Za-z0-9_](アンダースコアを含む)の単語の文字が

regex101.comでの例


確認してテストしてください。js-regexの経験はまだありません:p気に入ったようです
Jonny 5

6
\Wは非ラテン文字も非単語文字として認識することに注意してください。
Tyblitz

1
私は振り返ってみて、受け入れられたものがアンダースコアを除外しなかったので、私はこれらすべての年の後に正しい答えをマークしました
TheGeneral

143

ジョニー5は私に勝ちました。のようにを使用し\W+ないことをお勧め\stext.replace(/\W+/g, " ")ます。これは空白もカバーします。


それを指摘してくれた@ T-CatSanに感謝!それを持ち上げ、そしてサルマン、何に最善の答えを変更することが、あなたがしている無料:-)しかし、それはあるべき\W+ではない、[W+]すべて、まあ幸せな新年!
Jonny 5、2014年

ありがとう、@ Jonny5!ご提案いただいた変更を行いました。以前にブラケットでテストしたことがありましたが、ブラケットなしでも機能することがわかりました。あけましておめでとうを、あなたにも。
T-CatSan 2014年

1
@ T-CatSan例外を追加する方法はありますか?私は文字を維持したい&-。任意のヒント?
Renato Gama

1
/(\ W +)|(_)/ gも_を無視するように変更しました。しかし、なぜそれが最初のモデルで無視されておらず、私の正規表現が効率的なものであるのかと思っているだけです。
Sridhar Gudimela、2018年

14

以来[^a-z0-9]、文字クラスはalnumではないものをすべて含んでいる、それはあまりにも白い文字が含まれています!

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

6

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

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

編集\s事は一致して\r\nあまりにも。


ええ、そのトピックに関する他の回答から収集されたトム愚痴がそこにありましたが、それはうまくいきました!
TheGeneral

2

aは別の投稿にもダイアクリティカルマークが付いているのを見ました。

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


2

これは私の古い投稿です。承認された回答はほとんどの場合に適しています。しかし、私は各ソリューションと別の明白なソリューションをベンチマークすることに決めました(楽しみのために)。さまざまなサイズの文字列を使用するさまざまなブラウザーで、正規表現パターンに違いがあるかどうか疑問に思いました。

だから基本的に私はjsPerfを使用しまし

  • 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

使用したJavaScriptの例 var newstr = str.replace(/[\W_]+/g," ");

各実行は、各正規表現で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

正直なところ、両方のブラウザーのRegex(偏差を考慮に入れる)はほとんど区別がつきませんでしたが、これをさらに実行すると、結果はもう少し明確になります(ただし、それほどではありません)。

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

これは実際には大きな違いではないので、これらの結果についてはあまり取り上げません。さらに、私はとても退屈でした。

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

Jsperfベンチマークはこちら


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.