JavaScript dizesinde birden çok boşluğu tek boşlukla değiştirme


191

Ekstra boşluklara sahip dizelerim var, her seferinde birden fazla boşluk olduğunda sadece bir tane olmasını istiyorum.

Kimse? Google'da arama yapmayı denedim, ancak hiçbir şey benim için işe yaramadı.

Teşekkürler


2
Yinelenen boşlukları sondan / başından veya metnin herhangi bir yerinden kaldırmak?
ninjagecko

Yanıtlar:


371

Bunun gibi bir şey:

var s = "  a  b     c  ";

console.log(
  s.replace(/\s+/g, ' ')
)


31
@Me Lütfen soruyu dikkatle okuyun: "her seferinde birden fazla boşluk olduğunda, sadece bir tane olmasını istiyorum".
bjornd

5
Belli değil mi? 1'den fazla boşluk karakterini 1 boşluk karakteri ile değiştirir. (istenen sonuç)
Savaş

4
@CiaranG Düzenli bir ifade
pomeroy

1
@Wardy, yakın :-). Bir VEYA daha fazlasını bir boşlukla değiştirir (ancak gerçekten istenen sonuç).
greenoldman

1
Ya 1+ boşlukları aynı tür boşlukla değiştirmek isterse ne olur? (örneğin, boşluk içeren 2+ boşluk ve yeni satır içeren 3 yeni satır vb.) alanı
Tom

61

Aşağıdaki gibi, bu davranışları yöntem olarak uygulamak için Dize'yi artırabilirsiniz:

String.prototype.killWhiteSpace = function() {
    return this.replace(/\s/g, '');
};

String.prototype.reduceWhiteSpace = function() {
    return this.replace(/\s+/g, ' ');
};

Bu, artık istediğiniz dizeleri üretmek için aşağıdaki zarif formları kullanmanızı sağlar:

"Get rid of my whitespaces.".killWhiteSpace();
"Get rid of my extra        whitespaces".reduceWhiteSpace();

14
Standart nesnenin prototipini arttırmak gerçekten tartışmalı bir modeldir. Böyle temel bir soru için tavsiye etmem.
bjornd

@XavierJohn Bu String, S ile değil, R ile.
Android

20

replace işleviyle birlikte normal bir ifade kullanmak hile yapar:

string.replace(/\s/g, "")

Bu çözüm her soru için yanlıştır. Ve gerçekten daha iyi bir çözüm gönderildikten iki gün sonra neden yayınladığınızı merak ediyorum ...
Sebastian Mach

Bence o zamanlar sadece bu kod benim için çalıştı. Onaylamak için buna geri dönemem. Açıkçası ilk önce en iyi çözümü denerdim. Ayrıca, krom konsolunda kontrol ettikten sonra, her iki çözüm de işe yaradı. İlginç bir şekilde, sonucu bu yorum kutusuna kopyaladığımda, çözümümün birden fazla beyaz alanda çalışmadığını gösterdi. Belki de nedenini anlamama yardımcı olabilirsiniz. Sanırım bu bir krom hatası mı? Kodumu krom konsolda çalıştırmayı deneyin ve bana bildirin.
Roger Gajraj

13

İşte regex olmayan bir çözüm (sadece eğlence için):

var s = ' a   b   word word. word, wordword word   ';

// with ES5:
s = s.split(' ').filter(function(n){ return n != '' }).join(' ');
console.log(s); // "a b word word. word, wordword word"

// or ES6:
s = s.split(' ').filter(n => n).join(' '); 
console.log(s); // "a b word word. word, wordword word"

Dizeyi boşluklara böler, dizideki tüm boş dizi öğelerini (tek bir boşluktan daha fazla olanlar) kaldırır ve aralarında tek bir boşluk bulunan tüm kelimeleri bir dizgiye tekrar ekler.


12

Sanırım dizenin başından ve / veya sonundan boşluk bırakmak istediğinizi varsayalım ( tüm boşlukları kaldırmak yerine ?

Bu durumda, böyle bir regex'e ihtiyacınız olacak:

mystring = mystring.replace(/(^\s+|\s+$)/g,' ');

Bu, dizenin başından veya sonundan tüm boşlukları kaldıracaktır. Yalnızca sondaki boşlukları kırpmak istiyorsanız, normal ifade bunun yerine şöyle görünür:

mystring = mystring.replace(/\s+$/g,' ');

Umarım yardımcı olur.


4
Normal ifadeniz, @Spudley basitliğini seviyorum, ancak kodunuz başlangıçta ve sonunda tek boşluk karakteriyle boşlukların yerini almayacak mı? Amaç, boşlukları tamamen uçlardan kaldırmak olduğunu düşündüm, bu durumda değiştirme dizesi ''yerine yapılmalıdır ' '.
Randall Cook


6

Bir konuda büyücülük yapmamam gerektiğini biliyorum, ancak sorunun ayrıntıları göz önüne alındığında, genellikle şu anlama gelir:

  • Dize içindeki boşlukların birden çok oluşumunu tek bir boşlukla değiştirmek istiyorum
  • ... ve ... Dizenin başlangıcında veya sonunda beyaz boşluklar istemiyorum (trim)

Bunun için böyle bir kod kullanın (ilk regexp üzerindeki parantez sadece kodu biraz daha okunabilir hale getirmek için vardır ... regexps onlara aşina değilseniz bir ağrı olabilir):

s = s.replace(/^(\s*)|(\s*)$/g, '').replace(/\s+/g, ' ');

Bunun çalışmasının nedeni, String nesnesi üzerindeki yöntemlerin üzerinde başka bir yöntem çağırabileceğiniz bir dize nesnesi döndürmesidir (jQuery ve diğer bazı kütüphaneler gibi). Tek bir nesne üzerinde art arda birden çok yöntem yürütmek istiyorsanız kodlamanın çok daha kompakt bir yolu.


"Kullanıma hazır" örneği için +1 .. Ben
kendim gönderecektim

TAMAMEN ben ne aradığını, harika!
robertp

4

var x = "Test Test Test" .split ("") .join (""); uyarısı (x);


5
Çalışıyor ama akıllı kodlama değil. Bu kod bir RegEx'ten daha yavaştır. Split () bir dizeyi bölmek için RegEx kullanmıyorsa merak ediyorum!
Farandole

2

Bunu dene.

var string = "         string             1";
string = string.trim().replace(/\s+/g, ' ');

sonuç olacak

string 1

Burada olan şey, önce kullanarak dış boşlukları, trim()sonra kullanarak iç boşlukları kırpmasıdır .replace(/\s+/g, ' ').


0

Kullanıcının adında boşluk bırakmasını kısıtlamak istiyorsanız, bir if ifadesi oluşturun ve koşulu verin. benim yaptığım gibi:

$j('#fragment_key').bind({
    keypress: function(e){
        var key = e.keyCode;
    var character = String.fromCharCode(key); 
    if(character.match( /[' ']/)) {
        alert("Blank space is not allowed in the Name");
        return false;
        }
    }
});
  • JQuery işlevi yarat.
  • bu tuşa basma olayı.
  • Bir değişkeni başlatın.
  • Karakterle eşleşmek için koşul verin
  • eşleşen durumunuz için bir uyarı mesajı gösterin.

0

Buna ne dersin?

"my test string \t\t with crazy stuff is cool ".replace(/\s{2,9999}|\t/g, ' ')

çıktılar "my test string with crazy stuff is cool "

Bu da herhangi bir sekmeden kurtulur


Sekmeler zaten kapsamında \s. Gereksiz yere karmaşık normal ifade, sadece yazmak da olabilir /\s+/g.
Anders Rabo Thorbeck
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.