Як видалити пробіли з рядка за допомогою JavaScript?


552

Як видалити пробіли в рядку? Наприклад:

Вхід:

'/var/www/site/Brand new document.docx'

Вихід:

'/var/www/site/Brandnewdocument.docx'

моє рішення" ahm ed ".split('').filter(e => e.trim().length).join('')
UA_

Відповіді:


1224

Це?

str = str.replace(/\s/g, '');

Приклад

var str = '/var/www/site/Brand new document.docx';

document.write( str.replace(/\s/g, '') );


Оновлення: Виходячи з цього питання , це:

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

є кращим рішенням. Це дає такий же результат, але це робить швидше.

Регекс

\sявляє собою регулярний вираз для "пробілу", і gє "глобальним" прапором, що відповідає ВСІМ \s(пробіли).

Чудове пояснення +можна знайти тут .

Як бічна примітка, ви можете замінити вміст між окремими цитатами на все, що завгодно, так що ви можете замінити пробіл будь-яким іншим рядком.


@Gaurav Я шукав подібні відповіді на SO, і я бачу .replace(/\s+/g, '')це частіше. Чи є різниця між тим і моєю відповіддю?
Šime Vidas

в цьому випадку різниці немає. Але + використовується для пошуку з принаймні одним явищем.
Гаурав

1
Дурний мене, я був під враженням, що .replace(' ','')спрацює. Цінується!
Енді Мерсер

3
Оригінальна відповідь, що стосується (з якою посилається Симе у своїй редакції), +має лише 60 голосів, якщо хтось хоче зарахувати його / її занадто stackoverflow.com/a/5964427/4258817
Mousey

2
Будьте обережні, щоб випадково не процитувати ваш регулярний вираз, наприклад, .replace('/\s+/g', '')тому що він намагатиметься знайти цей буквальний рядок. Це спонукало мене раніше ...
RTF

75

var a = b = " /var/www/site/Brand new   document.docx ";

console.log( a.split(' ').join('') );
console.log( b.replace( /\s/g, '') ); 

Два способи зробити це!


4
Мені сподобався спліт () та приєднання ().
Ерік Мілліот-Мартінес

2
split ('') і приєднання не видалить \ n, \ t символи пробілу, інше вирішення - a.split (''). map (c => c.trim ()). join ('')
rab

36

Найкоротші та найшвидші :str.replace(/ /g, '');


Орієнтир:

Ось мої результати - (2018.07.13) MacOs High Sierra 10.13.3 на Chrome 67.0.3396 (64-розрядні), Safari 11.0.3 (13604.5.6), Firefox 59.0.2 (64-розрядні)):

КОРОТКІ струни

Короткий рядок, подібний до прикладів із запитання про ОП

введіть тут опис зображення

Найшвидшим рішенням у всіх браузерах є / /g(regexp1a) - Chrome 17.7M (робота / сек), Safari 10.1M, Firefox 8.8M. Найповільнішим для всіх браузерів було split-joinрішення. Змінення на \sабо додавання +або iповторне копіювання уповільнює обробку.

Довгі струни

Для рядків близько ~ 3 мільйонів результатів символів є:

  • regexp1a : Safari 50,14 ops / sec, Firefox 18,57, Chrome 8,95
  • regexp2b : Safari 38.39, Firefox 19.45, Chrome 9.26
  • спліт-приєднання : Firefox 26.41, Safari 23.10, Chrome 7.98,

Ви можете запустити його на своєму комп’ютері: https://jsperf.com/remove-string-spaces/1


1
Цікаво, що метод split-join зараз для мене найшвидший на Firefox 73, за ним слідує regexp1a на 53% повільніше.
hackel

25

Після відповіді @rsplak: насправді використання способу розділення / з'єднання швидше, ніж використання regexp. Див. Тест на ефективність роботи

Тому

var result = text.split(' ').join('')

працює швидше, ніж

var result = text.replace(/\s+/g, '')

Для невеликих текстів це не стосується, але це важливо для випадків, коли важливий час, наприклад, у аналізаторах тексту, особливо при взаємодії з користувачами.


З іншого боку, \s+обробляє більш широкий спектр космічних символів. Серед \nі з \t, він також відповідає \u00a0персонажам, і саме  це вмикається при отриманні тексту textDomNode.nodeValue.

Тому я думаю, що тут можна зробити такий висновок: якщо вам потрібно лише замінити пробіли ' ' , використовуйте розділити / об'єднати. Якщо символів класу символів можуть бути різні - використовуйтеreplace(/\s+/g, '')


1
це дуже не так way faster . запустив тест, і це лише на 2,19% швидше, на моєму Firefox 61.
vsync


2
  var output = '/var/www/site/Brand new document.docx'.replace(/ /g, ""); 
    or
  var output = '/var/www/site/Brand new document.docx'.replace(/ /gi,"");

Примітка. Хоча ви використовуєте 'g' або 'gi' для видалення пробілів, обидва поводяться однаково.

Якщо ми використовуємо 'g' у функції заміни, вона перевірятиме точну відповідність. але якщо ми використовуємо 'gi', він ігнорує чутливість регістру.

для довідки натисніть тут .


0

Regex + Замінити ()

Хоча регулярний вираз може бути повільнішим, у багатьох випадках використання розробник маніпулює лише декількома рядками одночасно, тому вважаючи, що швидкість не має значення. Незважаючи на те, що / / швидше, ніж / \ s /, наявність "\ s" пояснює, що відбувається з іншим розробником, можливо, більш чітко.

let string = '/var/www/site/Brand new document.docx';
let path = string.replace(/\s/g, '');
// path => '/var/www/site/Brandnewdocument.docx'

Розділити () + Приєднатися ()

Використання Split + Join дозволяє здійснювати подальші ланцюгові маніпуляції з рядком.

let string = '/var/www/site/Brand new document.docx';
let path => string.split('').map(char => /(\s|\.)/.test(char) ? '/' : char).join('');
// "/var/www/site/Brand/new/document/docx";
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.