为什么这个replace()不替换“我的”?

时间:2013-08-23 01:51:48

标签: javascript regex

有人可以解释为什么下面的replace()不会取代“我的”

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

有一个jsfiddle here

感谢。

4 个答案:

答案 0 :(得分: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次运行(在@ alfasin的答案中执行.replace()两次),或使用\b锚点在字边界而不是空格处匹配(@ Grim的解决方案)。

这是我使用单个替换操作的替代解决方案(在匹配的单词后面假定一个尾随空格):

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

\b是一个零宽度断言,也就是说,它匹配单词字符(\w)和非单词字符(\W),这样匹配就不会重叠并且在替换完成后没有多余的空格。当然,这只是为了给你一个想法,具体的用例(例如涉及标点符号)将需要更专业的正则表达式。

答案 1 :(得分:2)

我建议使用:

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

您的方法也会替换单词周围的空格,这就是为什么不替换第二个单词的原因。

编辑为大量单词添加解决方案:

$(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/

答案 2 :(得分:1)

将您的功能更改为:

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

答案 3 :(得分:0)

将“in”替换为“”会修改“my”之前的空格,因此之前的空格已被视为已处理,并且替换将在空格之后继续。

尝试使用字符串“将图像放入我的图库”,第一个将保留原样,而第二个将被替换。

其他人已经回答了如何达到想要的结果,所以这只是 为什么 的解释。