Может кто-нибудь объяснить, почему вместо() ниже, не заменяет «мой»Почему это не заменяет() заменить «мой»?
$(function() {
var str = "put image in my gallery";
str = str.replace(/ my | in /g, " ");
});
Там в jsfiddle here.
Спасибо.
Может кто-нибудь объяснить, почему вместо() ниже, не заменяет «мой»Почему это не заменяет() заменить «мой»?
$(function() {
var str = "put image in my gallery";
str = str.replace(/ my | in /g, " ");
});
Там в jsfiddle here.
Спасибо.
Я предложил бы использовать:
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/
Это не работает для меня: http://jsfiddle.net/kxjEE/3/ – alfasin
@alfasin это работает, вы просто забыли назначить его обратно. http://jsfiddle.net/kxjEE/4/ +1 для рабочего ответа. –
Я имел в виду, что он оставляет 2 пробела как «промежуток» в результате: http://jsfiddle.net/kxjEE/5/ – alfasin
Изменить функцию:
$(function() {
var str = "put image in my gallery";
str = str.replace(/ my(|\,|\.|\?)/g, " ").replace(/ in(|\,|\.|\?)/g, " ");
console.log(str);
});
Скобки вокруг слов избыточны. –
@Grim ... вы правы - исправлены, thx! – alfasin
+1 для рабочего решения должно работать до тех пор, пока слова имеют начальное и конечное пространства. –
Поскольку сличитель уже продвинутым. Матчи не могут перекрываться, поэтому пробел после 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
), таким образом совпадения не будут перекрываться, и после замены не будет дополнительных пробелов. Конечно, это просто для того, чтобы дать вам представление, конкретные варианты использования (например, с использованием пунктуации) потребуют более специализированных регулярных выражений.
Замена «in» на «» изменяет пространство перед «my», поэтому пространство перед ним уже считается обработанным, и замена продолжается сразу после пробела.
Попробуйте строку «Поместить изображение в мою галерею», первая будет оставлена как есть, а вторая будет заменена.
Другие уже ответили, как достичь желаемого результата, так что это просто объяснение к почему.
Проблема заключается в том, что вы опускаете пробелы – alfasin
Я думаю, причина в том, что вы используете «in» (включая его пространство), поэтому «my» не имеет перед ним пробела (замены выполняются на в то же время). Вы можете использовать regexp или, просто, используя 'str = str.replace (" in "," ").замените («мой», «»); 'таким образом вы замените« мой », используя пространство, сгенерированное при первой замене (изменение« в »на« »). Это должно быть проще, потому что есть только два условия для замены (вы, конечно, можете конкатенировать больше), но это должно избегать сложного регулярного выражения для простых замещений. –