2013-07-07 2 views
0

я получил следующий кодкак заменить символ ?

replaceforever: function(string,find,replace){ 
while(_.contains(string,find)){ 
    string.replace(find,replace); 
} 
return string;} 

и я посылаю к нему что-то вроде './routes\admin\articles.js','\\','/' , но всегда кажется, чтобы войти в то время цикла один раз и изменить все это с одной «/» как результат: | вместо того, чтобы быть хорошим ./routes/admin/articles.js

может кто-нибудь объяснить мне, пожалуйста, что я делаю неправильно?

+1

Почему бы просто не использовать регулярное выражение? Также обратите внимание, что если вы пытаетесь сделать это с помощью ./routes\admin\articles.js в виде строкового литерала, вам нужно будет избежать этих обратных косых черт. –

+0

Что '_' в функции' replaceforever'? –

ответ

0

Если я правильно, это будет делать глобальную замену:

stringVariable.replace(/\\/g, '/'); 
+0

Результат: «./routesadminarticles.js» – transilvlad

+0

Правильно, но не помогает OP. – 1983

+0

да, извините. Ему нужно удвоить обратную косую черту \\ – VixinG

0

Я думаю, что проблема на самом деле, что ваше время петлевой не вводится на всех, а не что это является введено один раз. Обратите внимание, что на вашем входе уже есть /, и я думаю, что это то, что вы видите.

Эта линия:

string.replace(find,replace); 

создает новую строку с указанной замены. , , а затем отбрасывает его. Поэтому, если ваш while-loop вводится даже один раз, это будет фактически бесконечный цикл, потому что тело цикла фактически ничего не делает. Вместо этого вам нужно сохранить результат в переменной string:

string = string.replace(find,replace); 

Но я не уверен, что этот метод действительно хорошая идея так или иначе. JavaScript уже предлагает «заменить все» функциональность, используя регулярные выражения:

result = input.replace(/\\/g, '/'); 
+0

Результат: ./routesadminarticles.js – transilvlad

+0

@tntu: Нет, это не так. Что заставляет вас думать так? – ruakh

+0

@tntu - Смотрите мой комментарий к вопросу. Если вы вызываете эту функцию напрямую со строковым литералом, обратные слэши выходят за символы, следующие за ними. Вам нужно избегать обратной косой черты. –

-2

Первое: string.replace() заменит все матчи, так что нет никакой необходимости итерации :)

Второе: string.replace() возвращает новую строку , он не изменит используемый объект.

Так что вам нужно что-то вроде:

replaceforever: function (string,find,replace) { 
    return string.replace(find,replace); 
} 
+2

Он не заменит все совпадения при вызове со строкой в ​​качестве первого аргумента. Он заменит первый матч. Чтобы заменить все совпадения, вам нужно вызвать его с помощью регулярного выражения с флагом 'g'. –

1

проблема с вашим тестирования, а не с кодом (если вы используете underscore.js, с использованием регулярных выражений было бы более разумно).

Вы должны сбежать от слеша входной строки:

replaceforever('./routes\\admin\\articles.js','\\','/'); 

'./routes\admin\articles.js', с другой стороны, имеет значение './routesadminarticles.js'.

+0

это правильный ответ +1 – VixinG

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