Замініть декілька пробілів на один пробіл у рядку JavaScript


191

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

Хтось? Я спробував шукати google, але мені нічого не вийшло.

Дякую


2
видалити дублікати пробілів з кінця / початку чи з будь-якого місця в тексті?
ninjagecko

Відповіді:


371

Щось на зразок цього:

var s = "  a  b     c  ";

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


31
@Me Будь ласка, уважно прочитайте питання: "кожного разу, коли є більше одного простору пробілів, я хотів би, щоб він був лише одним".
Бьорнд

5
Хіба це не очевидно? він замінює більше 1 символу пробілів на 1 пробіл. (бажаний результат)
Війна

4
@CiaranG Це звичайна експресія
pomeroy

1
@ Wardy, близько :-). Він замінює одну АБО більше на один пробіл (але, дійсно, бажаний результат).
greenoldman

1
Що робити, якщо потрібно замінити пробіли 1+ тим самим видом пробілів? (наприклад, 2+ пробіли з пробілом і 3 нові рядки з новим рядком тощо), якщо є і нові рядки, і пробіли, його потрібно буде замінити на новий рядок, тоді як якщо є і пробіли, і вкладки, його потрібно буде замінити на a космос
Том

61

Ви можете збільшити String, щоб реалізувати цю поведінку як методи, як у:

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

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

Це дозволяє вам використовувати наступні елегантні форми для створення потрібних струн:

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

14
Додавання прототипу стандартного об'єкта - справді суперечлива модель. Я б не рекомендував це для такого основного питання.
bjornd

@XavierJohn Це струна, з R, а не Sting.
LasagnaAndroid

20

використання регулярного виразу з функцією заміни виконує фокус:

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

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

Думаю, на той час для мене працював лише цей код. Я не можу повернутись до цього, щоб підтвердити. Я, очевидно, спробував би найкраще рішення спочатку. Також, перевіривши його на хромованій консолі, обидва рішення, здавалося, спрацювали. Цікаво, однак, коли я скопіював результат у це поле для коментарів, він показав, що моє рішення не працює для кількох пробілів. Можливо, ви можете допомогти мені зрозуміти, чому. Я думаю, це хромова помилка? Спробуйте запустити мій код у хромованій консолі та дайте мені знати.
Роджер Гаджрай

13

Ось нерегексивне рішення (просто для розваги):

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"

Він розбиває рядок на пробіли , видаляє з масиву всі порожні елементи масиву (ті, які були більше, ніж один пробіл), і з'єднує всі слова знову в рядок, з одним пробілом між ними.


12

Я припускаю, що ви хочете зняти пробіли з початку та / або кінця рядка (а не видаляти всі пробіли?

Якщо це так, вам знадобиться такий регулярний вираз:

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

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

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

Сподіваюся, що це допомагає.


4
Мені подобається простота вашого регулярного виразу @Spudley, але чи не замінить ваш код пробіли пробілів на початку та в кінці одним символом пробілу? Я думав , що мета полягала в тому, щоб видалити пробіли з кінців повністю, в цьому випадку заміна рядки повинна бути ''замість ' '.
Randall Cook


6

Я знаю, що я не повинен неромантизувати тему, але, враховуючи деталі запитання, я зазвичай розширюю це значення:

  • Я хочу замінити кілька випадків пробілу всередині рядка одним пробілом
  • ... і ... я не хочу пробілів у початковому або в кінці рядка (обробка)

Для цього я використовую такий код (круглі дужки на першому регулярному вираженні є просто для того, щоб зробити код трохи читабельнішим ... regexps може бути болем, якщо ви не знайомі з ними):

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

Причина цього працює в тому, що методи String-об'єкта повертають рядовий об'єкт, на який можна викликати інший метод (як і jQuery та деякі інші бібліотеки). Набагато більш компактний спосіб кодування, якщо ви хочете послідовно виконувати кілька методів на одному об'єкті.


+1 для прикладу "готового до використання". Я збирався опублікувати його сам
d.raev

ТОЧНО, що я шукав, приголомшливий!
Робертп

4

var x = "Тестовий тест тесту" .split ("") .join (""); оповіщення (х);


5
Це працює, але це не розумне кодування. Цей код повільніше, ніж RegEx. Цікаво, чи Split () не використовує RegEx для розділення рядка!
Фарандоль

2

Спробуйте це.

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

результат буде

string 1

Що сталося тут, це те, що він обріже спочатку зовнішні простори, trim()а потім обробить внутрішні простори, використовуючи .replace(/\s+/g, ' ').


0

Якщо ви хочете обмежити користувача, щоб він дав порожнє місце в імені, просто створіть оператор if і введіть умову. як я зробив:

$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.
  • це ключова преса.
  • Ініціалізуйте змінну.
  • Укажіть умову, що відповідає персонажу
  • показати попереджувальне повідомлення для відповідного стану.

0

Як щодо цього?

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

виходи "my test string with crazy stuff is cool "

Цей також позбавляється від будь-яких вкладок


Вкладки вже охоплені \s. Не зайвий складний регулярний вираз, може також просто написати /\s+/g.
Андерс Рабо Торбек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.