Alfa Sayısal olmayan tüm karakterleri, Yeni Satırları ve birden çok Beyaz Boşluğu bir Boşluk ile değiştirin


136

Değiştirilecek düzgün bir RegEx çözümü arıyorum

  • Alfa Sayısal Olmayan Tüm Karakterler
  • Tüm Yeni Hatlar
  • Beyaz boşluğun tüm çoklu örnekleri

Tek bir boşlukla


Evde oynayanlar için ( aşağıdakiler işe yarar )

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

Benim düşünceme göre, RegEx muhtemelen bunu tek bir ifadeyle başaracak kadar güçlü. Kimliğin ihtiyacı olduğunu düşündüğüm bileşenler

  • [^a-z0-9] - Alfa Sayısal olmayan karakterleri kaldırmak için
  • \s+ - herhangi bir alan koleksiyonuyla eşleştirin
  • \r?\n|\r - tüm yeni satırla eşleş
  • /gmi - küresel, çok satırlı, büyük / küçük harfe duyarlı değil

Ancak, normal ifadeyi doğru şekilde biçimlendiremiyorum ( aşağıdaki yöntem işe yaramıyor )

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


Giriş

234&^%,Me,2 2013 1080p x264 5 1 BluRay
S01(*&asd 05
S1E5
1x05
1x5


Istenilen çıktı

234 Me 2 2013 1080p x264 5 1 BluRay S01 asd 05 S1E5 1x05 1x5

Denemeniz tam olarak nasıl çalışmıyor? Ne ters gidiyor?
Pointy

Yanıtlar:


235

Bunun \W alt çizgiyi bıraktığının farkında olun . Kısa bir eşdeğer için [^a-zA-Z0-9]olurdu[\W_]

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

\Wolumsuzlanmasıdır steno \w için [A-Za-z0-9_](alt çizgi dahil) sözcük karakteri

Regex101.com'daki örnek


Kontrol edin ve test edin, js-regex konusunda henüz pek tecrübeniz yok: p Sevdiğinize sevindim
Jonny 5

6
\WLatin olmayan karakterlerin de kelime olmayan karakterler olarak tanınacağını unutmayın .
Tyblitz

1
Bunca yıldan sonra bu cevabı doğru olarak işaretledim, çünkü geriye baktım ve kabul
çizgileri

143

Jonny 5 beni yendi. Ben kullanarak önerecektim \W+olmadan \solduğu gibi text.replace(/\W+/g, " "). Bu, beyaz alanı da kapsar.


@ T-CatSan'a bunu işaret ettiğiniz için teşekkürler! İyileştirdin ve Saruman, en iyi cevabı her neyse değiştirmekte özgürsün :-) Ama bu olmalı \W+, [W+]Eh, mutlu yıllar!
Jonny 5

Teşekkürler @ Jonny5! Önerdiğiniz değişikliği yaptım. Daha önce braketlerle test etmiştim ve şimdi onlarsız çalıştığını görüyorum. Sana da mutlu yıllar.
T-CatSan

1
hey @ T-CatSan istisnalar eklemenin bir yolu var mı? Karakterleri korumak istiyorum &ve -. Herhangi bir ipucu?
Renato Gama

1
_'İ de yoksaymak için / (\ W +) | (_) / g aşağıdaki değişikliği yaptım. Ama neden ilk modelde görmezden gelmediğini ve benim normal ifadem olduğunu merak ediyorum.
Sridhar Gudimela

14

Yana [^a-z0-9]karakter sınıfı değil alnum olduğunu tümünü içeren, çok beyaz karakterler içeriyor!

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

6

Sanırım her modele bir nicelik belirteci eklemeniz gerekiyor. Ayrıca satırbaşı-dönüş meselesi biraz komik:

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

düzenlemek The \sthing eşleşiyor \rve \nçok.


Evet, konuyla ilgili diğer cevaplardan derlenen bazı tom aptallar vardı, ancak bu harika bir şekilde çalışıyor!
TheGeneral

2

Aksan işaretleri de olan farklı bir gönderi gördü, bu harika

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


2

Bu benim eski bir yazım, kabul edilen cevaplar çoğunlukla iyi. Bununla birlikte, her çözümü ve başka bir açık çözümü (sadece eğlence için) karşılaştırmaya karar verdim. Farklı boyutlu dizelere sahip farklı tarayıcılardaki normal ifade kalıpları arasında bir fark olup olmadığını merak ettim.

Yani temelde kullandım jsPerf üzerinde

  • Chrome 65.0.3325 / Windows 10 0.0.0'da test ediliyor
  • Edge 16.16299.0 / Windows 10 0.0.0'da test etme

Test ettiğim normal ifade kalıpları

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

Onları dize uzunluğunda rastgele karakterlerle yükledim

  • uzunluk 5000
  • uzunluk 1000
  • uzunluk 200

Kullandığım örnek javascript var newstr = str.replace(/[\W_]+/g," ");

Her çalışma, her normal ifadede 50 veya daha fazla örnekten oluşuyordu ve bunları her tarayıcıda 5 kez çalıştırıyorum.

Atlarımızı yarıştıralım!

Sonuçlar

                                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

Gerçek şu ki, her iki tarayıcıdaki Regex (sapmayı dikkate alarak) neredeyse ayırt edilemezdi, ancak bence bunu daha fazla çalıştırırsa sonuçlar biraz daha netleşir (ama çok değil).

1 karakter için teorik ölçeklendirme

                            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

Bu gerçekten önemli bir fark olmadığı için bu sonuçlara çok fazla değinmem, gerçekten söyleyebileceğimiz tek şey sınırın daha yavaş olduğu: o. Ayrıca çok sıkıldım.

Her neyse, kendi kendinize kıyaslama yapabilirsiniz.

Jsperf Benchmark burada


0

Çizgilerle değiştirmek için aşağıdakileri yapın:

text.replace(/[\W_-]/g,' ');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.