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

191

У меня есть строки с дополнительными пробелами, каждый раз, когда есть более одного пробела, я бы хотел, чтобы он был только один.

Кто угодно? Я пытался найти в Google, но у меня ничего не получалось.

Спасибо

канун
источник
2
удалить дубликаты пробелов в конце / начале или в любом месте текста?
ninjagecko
Возможный дубликат Regex для замены нескольких пробелов одним пробелом
Мухаммед Омар ЭльШурбаги

Ответы:

371

Что-то вроде этого:

var s = "  a  b     c  ";

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

bjornd
источник
31
@Me Пожалуйста, внимательно прочитайте вопрос: «каждый раз, когда есть более одного пробела, я бы хотел, чтобы он был только один».
Бьорнд
5
Разве это не очевидно? он заменяет более 1 пробела на 1 пробел. (желаемый результат)
War
4
@CiaranG Это регулярное выражение
Померой
1
@ Осторожно, близко :-). Он заменяет один ИЛИ больше одним пробелом (но, действительно, желаемый результат).
Гринольдман
1
Что если кто-то захочет заменить 1+ пробелов на те же пробелы? (например, 2+ пробела с пробелом и 3 новых строки с новой строкой и т. д.), если есть как новые строки, так и пробелы, их необходимо будет заменить новой строкой, тогда как если есть пробелы и символы табуляции, его необходимо заменить на космос
Том
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();
Gui PN
источник
14
Дополнение прототипа стандартного объекта - действительно спорная модель. Я не рекомендовал бы это для такого основного вопроса.
2012 года
@XavierJohn Это строка, с R, а не Стинг.
LasagnaAndroid
20

использование регулярного выражения с функцией replace делает свое дело:

string.replace(/\s/g, "")
Роджер Гайрай
источник
Это решение неверно по вопросу. И мне действительно интересно, почему вы опубликовали это через два дня после публикации лучшего решения ...
Себастьян Мах
Я думаю, что в то время только этот код работал для меня. Я не могу вернуться к этому, чтобы подтвердить. Очевидно, я бы сначала попробовал лучшее решение. Кроме того, после проверки в консоли Chrome оба решения, похоже, работали. Интересно, однако, что когда я скопировал результат в это поле для комментариев, это показало, что мое решение не работает для нескольких пробелов. Может быть, вы можете помочь мне понять, почему. Я думаю, это ошибка Chrome? Попробуйте запустить мой код в консоли Chrome и дайте мне знать.
Роджер Гайрай
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"

Он разбивает строку по пробелам , удаляет их все пустые элементы массива из массива (те, которые были больше, чем один пробел) и снова объединяет все слова в строку с одним пробелом между ними.

VSync
источник
12

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

Если это так, вам понадобится такое регулярное выражение:

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

Это удалит все пробелы в начале или конце строки. Если вы хотите обрезать пробелы только с конца, тогда регулярное выражение будет выглядеть так:

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

Надеюсь, это поможет.

Spudley
источник
4
Мне нравится простота вашего регулярного выражения @Spudley, но разве ваш код не заменит пробелы в начале и конце одним пробелом? Я думал , что цель состояла в том, чтобы удалить пробелы из концов полностью, в этом случае замена строки должна быть ''вместо ' '.
Рэндалл Кук
8

jQuery.trim () работает хорошо.

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

chug2k
источник
14
Просто помните, что это не удаляет все пробелы. Цитирование документов: «Удалите пробелы из начала и конца строки ».
Джоник
6

Я знаю, что не должен быть некромантиком по предмету, но, учитывая детали вопроса, я обычно расширяю его следующим образом:

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

Для этого я использую такой код (круглые скобки в первом регулярном выражении существуют только для того, чтобы сделать код более читабельным ... регулярные выражения могут быть неприятны, если вы не знакомы с ними):

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

Причина, по которой это работает, заключается в том, что методы объекта String возвращают строковый объект, для которого вы можете вызвать другой метод (так же, как jQuery и некоторые другие библиотеки). Гораздо более компактный способ написания кода, если вы хотите последовательно выполнить несколько методов для одного объекта.

Маркку Уттула
источник
+1 за пример "готов к использованию" .. Я собирался опубликовать его сам
д.раев
Именно то, что я искал, потрясающе!
Роберт
4

var x = "Test Test Test" .split ("") .join (""); оповещение (х);

Правин Кумар Таллури
источник
5
Это работает, но это не умное кодирование. Этот код медленнее, чем RegEx. Интересно, если Split () не использует RegEx для разделения строки!
Farandole
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 "

Этот избавляется от любых вкладок, а также

user3413723
источник
Вкладки уже накрыты \s. Неоправданно сложное регулярное выражение, можно просто написать /\s+/g.
Андерс Рабо Торбек