Zamień wiele białych znaków na pojedynczy biały znak w ciągu JavaScript


191

Mam ciągi znaków z dodatkowymi białymi spacjami, za każdym razem, gdy jest więcej niż jedna biała spacja, chciałbym, żeby była tylko jedna.

Ktoś? Próbowałem wyszukać w Google, ale nic mi nie działało.

Dzięki


2
usunąć zduplikowane białe znaki od końca / początku, czy gdziekolwiek w tekście?
ninjagecko

Odpowiedzi:


371

Coś takiego:

var s = "  a  b     c  ";

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


31
@Me Proszę uważnie przeczytać pytanie: „za każdym razem, gdy jest więcej niż jedna biała spacja, chciałbym, żeby była tylko jedna”.
bjornd

5
Czy to nie oczywiste? zastępuje więcej niż 1 znak białych znaków 1 znakiem białych znaków. (pożądany wynik)
Wojna

4
@CiaranG Jest to regularna ekspresja
pomeroy

1
@Wardy, zamknij :-). Zastępuje jedno LUB więcej jednym spacją (ale faktycznie pożądany wynik).
greenoldman

1
Co jeśli ktoś chce zastąpić 1+ białych spacjami tego samego rodzaju białymi spacjami? (np. ponad 2 spacje ze spacją i 3 nowe wiersze z nową linią itp.) Jeśli są zarówno nowe linie, jak i spacje, trzeba by je zastąpić nową linią, natomiast jeśli są zarówno spacje, jak i tabulatory, należy je zastąpić space
Tom

61

Możesz rozszerzyć String, aby zaimplementować te zachowania jako metody, jak w:

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

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

Dzięki temu możesz teraz używać następujących eleganckich formularzy do tworzenia pożądanych ciągów:

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

14
Wzmocnienie prototypu obiektu standardowego jest naprawdę kontrowersyjnym wzorcem. Nie poleciłbym tego na tak podstawowe pytanie.
bjornd

@XavierJohn It's String, with R, not Sting.
LasagnaAndroid

20

użycie wyrażenia regularnego z funkcją zamiany rozwiązuje problem:

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

To rozwiązanie jest niewłaściwe w zależności od pytania. Naprawdę zastanawiam się, dlaczego opublikowałeś go dwa dni po opublikowaniu lepszego rozwiązania ...
Sebastian Mach

Myślę, że wtedy tylko ten kod działał dla mnie. Nie mogę wrócić do tego, aby potwierdzić. Oczywiście najpierw spróbowałbym najlepszego rozwiązania. Ponadto, po sprawdzeniu go w chromowanej konsoli, oba rozwiązania wydawały się działać. Co ciekawe, kiedy skopiowałem wynik do tego pola komentarza, pokazało to, że moje rozwiązanie nie działa na wielu białych znakach. Może pomożesz mi zrozumieć, dlaczego. Myślę, że to błąd chrome? Spróbuj uruchomić mój kod w konsoli Chrome i daj mi znać.
Roger Gajraj,

13

Oto rozwiązanie niebędące wyrażeniami regularnymi (dla zabawy):

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"

Dzieli ciąg znaków na białe spacje , usuwa je z tablicy wszystkie puste elementy tablicy (te, które były więcej niż pojedynczą spacją) i ponownie łączy wszystkie słowa w ciąg, z pojedynczą spacją między nimi.


12

Zakładam, że chcesz usunąć spacje od początku i / lub końca łańcucha (zamiast usuwać wszystkie spacje?

W takim przypadku będziesz potrzebować takiego wyrażenia regularnego:

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

Spowoduje to usunięcie wszystkich spacji z początku lub końca łańcucha. Jeśli chcesz przycinać spacje od końca, wyrażenie regularne wyglądałoby tak:

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

Mam nadzieję, że to pomaga.


4
Podoba mi się prostota twojego wyrażenia regularnego @Spudley, ale czy twój kod nie zastąpi ciągów spacji na początku i nie kończy się pojedynczym znakiem spacji? Myślałem, że celem było usunąć spacje z końców całkowicie, w którym to przypadku ciąg wymiana powinny być ''zamiast ' '.
Randall Cook


6

Wiem, że nie powinienem nekromancji na dany temat, ale biorąc pod uwagę szczegóły pytania, zwykle rozszerzam je na:

  • Chcę zastąpić wielokrotne występowanie białych znaków w ciągu pojedynczą spacją
  • ... i ... Nie chcę białych znaków na początku ani na końcu łańcucha (przycinanie)

W tym celu używam takiego kodu (nawiasy na pierwszym wyrażeniu regularnym są tylko po to, aby uczynić kod nieco bardziej czytelnym ... wyrażenia regularne mogą być uciążliwe, chyba że się z nimi zaznajomisz):

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

Powodem tego jest to, że metody na obiekcie String zwracają obiekt string, na którym można wywołać inną metodę (podobnie jak jQuery i niektóre inne biblioteki). Znacznie bardziej kompaktowy sposób kodowania, jeśli chcesz wykonywać wiele metod na jednym obiekcie kolejno.


+1 za przykład „gotowy do użycia”. Zamierzałem zamieścić go w moim serwisie
d.raev

DOKŁADNIE to, czego szukałem, niesamowite!
robertp

4

var x = „Test Test Test” .split („”) .join („”); alert (x);


5
Działa, ale nie jest inteligentnym kodowaniem. Ten kod jest wolniejszy niż RegEx. Zastanawiam się, czy Split () nie używa RegEx do dzielenia łańcucha!
Farandole,

2

Spróbuj tego.

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

wynik będzie

string 1

To, co się tutaj wydarzyło, polega na tym, że najpierw przycina przestrzenie zewnętrzne, trim()a następnie przycina przestrzenie wewnętrzne za pomocą .replace(/\s+/g, ' ').


0

Jeśli chcesz ograniczyć użytkownika do podawania pustego miejsca w nazwie, po prostu stwórz instrukcję if i podaj warunek. Jak ja zrobiłem:

$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;
        }
    }
});
  • utwórz funkcję JQuery.
  • to jest kluczowe wydarzenie prasowe.
  • Zainicjuj zmienną.
  • Podaj warunek pasujący do postaci
  • pokaż komunikat ostrzegawczy dla twojego pasującego stanu.

0

Co powiesz na ten?

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

wyjścia "my test string with crazy stuff is cool "

Ten usuwa również wszystkie zakładki


Karty są już objęte \s. Niepotrzebnie złożone wyrażenie regularne, równie dobrze może po prostu pisać /\s+/g.
Anders Rabo Thorbeck
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.