2013-08-23 3 views
1

Может кто-нибудь объяснить, почему вместо() ниже, не заменяет «мой»Почему это не заменяет() заменить «мой»?

$(function() { 
    var str = "put image in my gallery"; 
    str = str.replace(/ my | in /g, " "); 
}); 

Там в jsfiddle here.

Спасибо.

+2

Проблема заключается в том, что вы опускаете пробелы – alfasin

+0

Я думаю, причина в том, что вы используете «in» (включая его пространство), поэтому «my» не имеет перед ним пробела (замены выполняются на в то же время). Вы можете использовать regexp или, просто, используя 'str = str.replace (" in "," ").замените («мой», «»); 'таким образом вы замените« мой », используя пространство, сгенерированное при первой замене (изменение« в »на« »). Это должно быть проще, потому что есть только два условия для замены (вы, конечно, можете конкатенировать больше), но это должно избегать сложного регулярного выражения для простых замещений. –

ответ

2

Я предложил бы использовать:

str.replace(/\bmy\b|\bin\b/g, ""); 

Ваш метод также заменяет пробелы вокруг слов, поэтому второй не будет заменен.

Edited добавить раствор для многих слов:

$(function() { 
    var toReplace = ['what','a','lot','of','words']; 
    var r = ''; 
    toReplace.forEach(function(v) { 
     r += '\\b' + v + '\\b|'; 
    }); 
    r.substring(0, r.length - 1); // remove the final '|' 
    var re = new RegExp(r,"g"); 
    var str = "here are some words"; 
    str = str.replace(re, ""); 
    console.log(str); 
}); 

Все, что вам нужно сделать, это положить слова в массив. http://jsfiddle.net/kxjEE/7/

+0

Это не работает для меня: http://jsfiddle.net/kxjEE/3/ – alfasin

+0

@alfasin это работает, вы просто забыли назначить его обратно. http://jsfiddle.net/kxjEE/4/ +1 для рабочего ответа. –

+0

Я имел в виду, что он оставляет 2 пробела как «промежуток» в результате: http://jsfiddle.net/kxjEE/5/ – alfasin

1

Изменить функцию:

$(function() { 
    var str = "put image in my gallery"; 
     str = str.replace(/ my(|\,|\.|\?)/g, " ").replace(/ in(|\,|\.|\?)/g, " "); 
    console.log(str); 
}); 
+0

Скобки вокруг слов избыточны. –

+0

@Grim ... вы правы - исправлены, thx! – alfasin

+0

+1 для рабочего решения должно работать до тех пор, пока слова имеют начальное и конечное пространства. –

7

Поскольку сличитель уже продвинутым. Матчи не могут перекрываться, поэтому пробел после in не может использоваться для соответствия пробелу до my.

Вот краткое изложение, с | представляет положение согласовани:

'put image| in my gallery' //found the first space 
'put image| in |my gallery' //completed a match 
'put image |my gallery' //replaced the match with a " " 
'put image |my gallery' //fails to match the required space before "my" 

Обходных включает делать 2 пробегов (исполняющие .replace() два раза в @ alfasin отвечают), или использовать \b якорь, чтобы соответствовать на границах слов вместо пространств (решение @ Grim).

Вот мое альтернативное решение с одной заменой операции (предполагается, завершающий пробел после соответствующих слов):

'put image in my gallery'.replace(/\b(?:my|in) /g, ''); 
//'put image gallery' 

\b является нулевой шириной утверждения, то есть, он соответствует между символами слова (\w) и не-словные символы (\W), таким образом совпадения не будут перекрываться, и после замены не будет дополнительных пробелов. Конечно, это просто для того, чтобы дать вам представление, конкретные варианты использования (например, с использованием пунктуации) потребуют более специализированных регулярных выражений.

0

Замена «in» на «» изменяет пространство перед «my», поэтому пространство перед ним уже считается обработанным, и замена продолжается сразу после пробела.

Попробуйте строку «Поместить изображение в мою галерею», первая будет оставлена ​​как есть, а вторая будет заменена.

Другие уже ответили, как достичь желаемого результата, так что это просто объяснение к почему.

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