Regex для замены нескольких пробелов одним пробелом

281

Для строки типа:

"The dog      has a long   tail, and it     is RED!"

Какую манеру jQuery или JavaScript можно использовать для сохранения пробелов только в одном пространстве max?

Цель:

"The dog has a long tail, and it is RED!"
  • 3
    Вы также хотите соответствовать символам табуляции белых пробелов?
  • 0
    @Chris, да, пожалуйста, отличный вопрос .... При всех этих разных ответах, как узнать, какое решение является наиболее эффективным?
Показать ещё 3 комментария
Теги:

16 ответов

508
Лучший ответ

Учитывая, что вы также хотите охватить вкладки, новые строки и т.д., просто замените \s\s+ на ' ':

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

Если вы действительно хотите охватить только пробелы (и, следовательно, не табуляции, строки перевода и т.д.), выполните следующие действия:

string = string.replace(/  +/g, ' ');
  • 2
    Это также удаляет символы белой строки?
  • 3
    Вам также необходимо добавить флаг 'g' в регулярное выражение.
Показать ещё 10 комментариев
122

Поскольку вы, похоже, заинтересованы в производительности, я профилировал их с помощью firebug. Вот результаты, которые я получил:

str.replace( / +/g, ' ' )        ->  790ms
str.replace( /  +/g, ' ' )       ->  380ms
str.replace( / {2,}/g, ' ' )     ->  470ms
str.replace( /\s\s+/g, ' ' )     ->  390ms
str.replace( / +(?= )/g, ' ')    -> 3250ms

Это на Firefox, на котором выполняется замена строк на 100k.

Я рекомендую вам выполнить свои собственные тесты профилирования с помощью firebug, если вы считаете, что производительность является проблемой. Люди, как известно, плохо предсказывают, где лежат узкие места в их программах.

(Также обратите внимание, что панель инструментов разработчика IE 8 также имеет встроенный профилировщик - возможно, стоит проверить, что такое производительность в IE.)

  • 4
    jsperf.com/removing-multiple-spaces Вперед и JSPerf! Последний метод; ( / +(?= )/g, ' '); в IE9 происходит сбой, он оставляет двойные пробелы: "Foo Bar Baz".replace(/ +(?= )/g, ' '); -> "Foo Bar Baz"
  • 0
    как много различий между 1 и 2 строкой
Показать ещё 3 комментария
34
var str = "The      dog        has a long tail,      and it is RED!";
str = str.replace(/ {2,}/g,' ');

EDIT: Если вы хотите заменить все символы пробелов, наиболее эффективным способом будет:

str = str.replace(/\s{2,}/g,' ');
  • 0
    Забавно, что в вашей тестовой строке нет даже двух пробелов.
  • 0
    только что понял, что у тебя уже есть то, что я недавно придумал, +1 :)
Показать ещё 2 комментария
12

Это одно решение, хотя оно будет нацелено на все пробелы:

"The      dog        has a long tail,      and it is RED!".replace(/\s\s+/g, ' ')

"The dog has a long tail, and it is RED!"

Изменить. Это, вероятно, лучше, поскольку он нацелен на пробел, за которым следуют 1 или более пробелов:

"The      dog        has a long tail,      and it is RED!".replace(/  +/g, ' ')

"The dog has a long tail, and it is RED!"

Альтернативный метод:

"The      dog        has a long tail,      and it is RED!".replace(/ {2,}/g, ' ')
"The dog has a long tail, and it is RED!"

Я не использовал /\s+/ сам по себе, так как это заменяет пробелы, которые охватывают 1 символ несколько раз и может быть менее эффективным, поскольку он нацелен на большее, чем необходимо.

Я не испытал ни одного из них, поэтому lmk, если есть ошибки.

Кроме того, если вы собираетесь выполнять замену строк, забудьте повторно назначить переменную/свойство своей собственной замене, например:

var string = 'foo'
string = string.replace('foo', '')

Использование jQuery.prototype.text:

var el = $('span:eq(0)');
el.text( el.text().replace(/\d+/, '') )
  • 1
    Первый из них абсолютно бессмысленный, \ s \ s + означает, что за \ s следует один или несколько \ s +, что можно уменьшить до одного \ s +, второй пример более точный, потому что мы хотим заменить только двойные пробелы, а не новая строка, третья более оптимизирована, поскольку она применима только к примерам с пробелами 2+. Но str.replace (/ + (? =) / G, '') ;, применяется только к примерам с пробелами 2+, но сохраняет перезапись пробела с шагом пробела.
  • 3
    EvanCarroll вы провалили, потому что \ s \ s + определенно отличается от \ s +. \ s \ s + будет соответствовать '\ t \ t' или '\ t \ t \ t', но НЕ '\ t'. И это все, что вам нужно, вы не хотите заменять каждый символ пробела.
Показать ещё 1 комментарий
11

У меня есть этот метод, я называю его методом Derp из-за отсутствия лучшего имени.

while (str.indexOf("  ") !== -1) {
    str = str.replace(/  /g, " ");
}

Запуск в JSPerf дает некоторые неожиданные результаты.

  • 2
    Я буду чертовски смущен, если окажется, что я выдумал тестовый пример вместо того, чтобы на самом деле быть быстрым: D
  • 0
    Предоставление теста ... Отличный ответ!
Показать ещё 2 комментария
8

Более надежный:

function trim(word)
{
    word = word.replace(/[^\x21-\x7E]+/g, ' '); // change non-printing chars to spaces
    return word.replace(/^\s+|\s+$/g, '');      // remove leading/trailing spaces
}
7

Я предлагаю

string = string.replace(/ +/g," ");

для пробелов
OR

string = string.replace(/(\s)+/g,"$1");

для включения нескольких возвратов в один возврат.

6

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

// NOTE the possible initial and trailing spaces
var str = "  The dog      has a long   tail, and it     is RED!  "

str = str.replace(/^\s+|\s+$|\s+(?=\s)/g, "");

// str -> "The dog has a long tail, and it is RED !"

В вашем примере не было таких пробелов, но они тоже очень распространенный сценарий, и принятый ответ обрезал даже те, что были в одиночных пространствах, например: "... RED!", что не так, как вы обычно необходимо.

  • 3
    Я использовал этот шаблон на PHP и работает. $ parts = preg_split ("/ ^ \ s + | \ s + $ | \ s + (? = \ s) /", "Авенида Танкредо Невес, 745 Писо Террео Сала");
5

Вот альтернативное решение, если вы не хотите использовать replace (заменить пробелы в строке без использования javascript)

var str="The dog      has a long   tail, and it     is RED!";
var rule=/\s{1,}/g;
str = str.split(rule).join(" "); 
document.write(str);
3

Всесторонний незашифрованный ответ для новичков и др.

Это для всех манекенов, подобных мне, которые тестируют скрипты, написанные некоторыми из вас, ребята, которые не работают.

Следующие 3 примера - это шаги, которые я предпринял для удаления специальных символов и дополнительных пробелов на следующих 3 сайтах (все они отлично работают) {1. EtaVisa.com 2. EtaStatus.com 3. Tikun.com}, поэтому я знаю, что они работают отлично.

Мы скопировали их вместе с более чем 50 за раз и НЕТ проблем.

//Это удаляет специальные символы + 0-9 и позволяет использовать только буквы (верхний и нижний регистр)

function NoDoublesPls1()
{
var str=document.getElementById("NoDoubles1");
var regex=/[^a-z]/gi;
str.value=str.value.replace(regex ,"");
}

//Это удаляет специальные символы и допускает только буквы (верхний и нижний регистр) и 0-9 И пробелы

function NoDoublesPls2()
{
var str=document.getElementById("NoDoubles2");
var regex=/[^a-z 0-9]/gi;
str.value=str.value.replace(regex ,"");
}

//Это удаляет специальные символы и допускает только буквы (верхний и нижний регистр) и 0-9 И пробелы //The.replace(/\ s\s +/g, "") в конце удаляет лишние пробелы // когда я использовал одинарные кавычки, это не сработало.

function NoDoublesPls3()
{    var str=document.getElementById("NoDoubles3");
var regex=/[^a-z 0-9]/gi;
str.value=str.value.replace(regex ,"") .replace(/\s\s+/g, " ");
}

:: СЛЕДУЮЩИЙ:: Сохранить # 3 как .js//Я назвал мой NoDoubles.js

:: СЛЕДУЮЩИЙ:: Включите свой JS на свою страницу   < script language = "JavaScript" src= "js/NoDoubles.js" > </script>

:: СЛЕДУЮЩИЙ:: Включите это в поле формы:: например, < INPUT type = "text" name= "Name" > строка    onKeyUp = "NoDoublesPls3()" onKeyDown = "NoDoublesPls3()" id = "NoDoubles3"

Чтобы это выглядело так   < INPUT type = "text" name= "Name" onKeyUp = "NoDoublesPls3()" onKeyDown = "NoDoublesPls3()" id = "NoDoubles3" >

Это приведет к удалению специальных символов, разрешению пробелов и удалению лишних пробелов.

  • 0
    Что здесь происходит? Форматирование выглядит очень, очень нарушено.
3

Также возможно:

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

Я знаю, что опаздываю на вечеринку, но я нашел хорошее решение.

Вот он:

var myStr = myStr.replace(/[ ][ ]*/g, ' ');
  • 0
    Для IntelliJ Regex это сработало для меня
1

JQuery имеет функцию trim(), которая в основном превращает что-то вроде этой "FOo Bar" в "FOo Bar".

var string = "  My     String with  Multiple lines    ";
string.trim(); // output "My String with Multiple lines"

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

  • 2
    Как вы сказали, trim () удаляет пустые пробелы в начале и в конце строки, но не в середине строки, поэтому в данном случае это не работает, вывод будет просто «Моя строка с несколькими» линии». api.jquery.com/jQuery.trim
0

Мы можем использовать следующее регулярное выражение, объясненное с помощью команды sed system. Аналогичное регулярное выражение может использоваться на других языках и платформах.

Добавьте текст в какой-нибудь файл say test

manjeet-laptop:Desktop manjeet$ cat test
"The dog      has a long   tail, and it     is RED!"

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

manjeet-laptop:Desktop manjeet$ sed 's/ \{1,\}/ /g' test
"The dog has a long tail, and it is RED!"

Надеюсь, что это служит цели

0
var string = "The dog      has a long   tail, and it     is RED!";
var replaced = string.replace(/ +/g, " ");

Или если вы также захотите заменить вкладки:

var replaced = string.replace(/\s+/g, " ");
  • 0
    использование + кажется более чистым, но оно также заменит одиночные пробелы одиночными пробелами, немного излишними, и я не уверен, но это может создать проблемы производительности с гораздо более длинным текстом.
  • 0
    Я склонен использовать самое короткое и простое решение, которое будет работать, и беспокоиться об оптимизации такого рода только в том случае, если я знаю, что мне нужно сопоставлять очень большую строку, и в этот момент я на самом деле буду измерять различные решения, чтобы увидеть, какие из них будут будь быстрее Может быть трудно заранее предсказать, что будет быстрее без тестирования; например, в интерпретаторах JavaScript некоторые сложные регулярные выражения заставят вас перейти от быстрой JIT-скомпилированной реализации к медленной интерпретируемой.
0
var myregexp = new RegExp(/ {2,}/g);

str = str.replace(myregexp,' ');

Ещё вопросы

Сообщество Overcoder
Наверх
Меню