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

przeddzień
źródło
2
usunąć zduplikowane białe znaki od końca / początku, czy gdziekolwiek w tekście?
ninjagecko
Możliwy duplikat Regexu w celu zastąpienia wielu spacji jednym spacją
Muhammad Omar ElShourbagy

Odpowiedzi:

371

Coś takiego:

var s = "  a  b     c  ";

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

Bjornd
źródło
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();
gui pn
źródło
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, "")
Roger Gajraj
źródło
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.

vsync
źródło
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.

Spudley
źródło
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
8

jQuery.trim () działa dobrze.

http://api.jquery.com/jQuery.trim/

chug2k
źródło
14
Pamiętaj tylko, że nie usuwa to wszystkich białych znaków. Cytując dokumenty: „Usuń spację od początku i końca łańcucha ”.
Jonik
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.

Markku Uttula
źródło
+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);

Praveen Kumar Thalluri
źródło
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, ' ').

Richard Vergis
źródło
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.
Abhijit BIswas
źródło
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

użytkownik3413723
źródło
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