2010-09-25 3 views
207

У меня есть строка, которая содержит несколько пробелов. Я хочу заменить их символом плюса. Я думал, что могу использоватьЗаменить все пробелы в строке «+»

var str = 'a b c'; 
var replaced = str.replace(' ', '+'); 

, но это только заменяет первое появление. Как я могу заставить его заменить все вхождения?

+5

Вы пытаетесь сделать URL-кодировку строки? Если это так, лучше обратиться за помощью к этому, чем просто обработать пробелы. –

+2

@ Lasse, я полагаю, в конечном итоге это то, что я пытаюсь сделать, поскольку строка, которую я хочу отформатировать, в конечном итоге станет частью URL-адреса. Однако, я думаю, этот вопрос по-прежнему стоит на собственном меррите, поскольку замена всех вхождений подстроки внутри строки не сразу очевидна. – DaveDev

+12

Правильно, это было мое подозрение. Ответ на этот вопрос: use 'encodeURIComponent()'. Не пытайтесь взломать его самостоятельно, заменив строку; это намного сложнее, чем вы думаете. Это будет кодировать пробелы в '% 20', а не' + '. '% 20' является таким же достоверным (на самом деле более корректным, так как он работает в компонентах пути, тогда как' + 'означает только пространство в компонентах запроса), но если вы хотите, чтобы он выглядел чуть красивее, вы всегда можете сделать замену (/% 20/g, '+') 'впоследствии. Возможно, у вас возникнет соблазн использовать 'escape()', потому что он использует '+', но он также не использует все символы, отличные от ASCII, - избегайте. – bobince

ответ

319

Вот альтернатива, которая не требует регулярных выражений:

var str = 'a b c'; 
var replaced = str.split(' ').join('+'); 
+16

Это выбранное решение медленнее при большой замене по сравнению с версией выражения reg. Тест с тремя решениями, размещенными: http://jsbin.com/isadi3/2 У Firefox минимальная разница во времени, IE имеет заметную разницу. Поэтому, если скорость имеет значение, и у вас есть большой набор заметок, reg exp - это путь. – epascarello

+20

use str = str.replace (/ \ s/g, "+"); –

+1

@JitendraPancholi, который заменяет все пробелы, а не только символ пробела. Другой ответ регулярного выражения здесь в порядке. –

347

Вам нужен (глобальный) вариант /g, как это:

var replaced = str.replace(/ /g, '+'); 

You can give it a try here. В отличие от большинства других языков, JavaScript по умолчанию заменяет только первое вхождение.

+3

лучший способ сделать это .... :) –

+6

Это должен быть принятый ответ прямо здесь. – David

15

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

var replaced = str.replace(/ /g, '+'); 

От Using Regular Expressions with JavaScript and ActionScript:

/г дает "глобальное" соответствия. При использовании метода replace() укажите этот модификатор для замены всех совпадений, а не только первого.

3

Вам нужно искать какой-то вариант replaceAll

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

это регулярное выражение способ делать replaceAll.

function ReplaceAll(Source, stringToFind, stringToReplace) { 
    var temp = Source; 
    var index = temp.indexOf(stringToFind); 

    while (index != -1) { 
     temp = temp.replace(stringToFind, stringToReplace); 
     index = temp.indexOf(stringToFind); 
    } 

    return temp; 
} 

String.prototype.ReplaceAll = function (stringToFind, stringToReplace) { 
    var temp = this; 
    var index = temp.indexOf(stringToFind); 

    while (index != -1) { 
     temp = temp.replace(stringToFind, stringToReplace); 
     index = temp.indexOf(stringToFind); 
    } 

    return temp; 

}; 
+2

Ничего себе. Er ... для этого есть * очень простая идиома: 'str.split (stringToFind) .join (stringToReplace)'. – bobince

+0

Вау - это неэффективно. – epascarello

+0

@epascarello на самом деле работает быстрее, чем регулярное выражение или выше inddedelity :) –

65
var str = 'a b c'; 
var replaced = str.replace(/\s/g, '+'); 
+3

Чище и быстрее, чем выбранное решение; работает там, где '//g' не работает. –

-1

ли это рекурсивно:

public String replaceSpace(String s){ 
    if (s.length() < 2) { 
     if(s.equals(" ")) 
      return "+"; 
     else 
      return s; 
    } 
    if (s.charAt(0) == ' ') 
     return "+" + replaceSpace(s.substring(1)); 
    else 
     return s.substring(0, 1) + replaceSpace(s.substring(1)); 
} 
+0

В ответах здесь уже есть лучшие решения. –

3

неразрывный пробел НОМЕР

В некоторых браузерах

(MSIE "как правило," ;-))

замещающих пространство в строковых игнорирует неразрывное пространство (код 160 символов).

Всегда следует заменить, как это:

myString.replace(/[ \u00A0]/, myReplaceString) 

Очень хороший подробное объяснение:

http://www.adamkoch.com/2009/07/25/white-space-and-character-160/

32

Вы также можете сделать это, как

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

Посмотрите к скрипка: http://jsfiddle.net/aC5ZW/

+0

Не могли бы вы объяснить, почему это является хорошим решением проблемы. –

+1

Не было моей нисходящей линии, я получил задачу обзора, чтобы проверить из-за длины содержимого. Я предполагаю, что кто-то более требовательный не видит объяснений и ниспровергает, не утруждая себя комментариями. Пожалуйста, внесите свой комментарий в ответ. –

+0

Хорошо, я добавил скрипку в свой ответ. –

Смежные вопросы