1

有人可以解释为什么下面的 replace() 不能替换“我的”

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

这里有一个jsfiddle 。

谢谢。

4

4 回答 4

7

因为匹配器已经前进了。匹配项不能重叠,因此 after 的空格in不能用于匹配 before 的空格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"

.replace()解决方法包括运行 2 次(在@alfasin 的答案中执行两次),或者使用\b锚点匹配单词边界而不是空格(@Grim 的解决方案)。

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

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

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

于 2013-08-23T02:00:25.653 回答
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/

于 2013-08-23T01:56:32.777 回答
1

将您的功能更改为:

$(function() {
     var str = "put image in my gallery";
        str = str.replace(/ my( |\,|\.|\?)/g, " ").replace(/ in( |\,|\.|\?)/g, " ");
    console.log(str);
});
于 2013-08-23T01:57:24.040 回答
0

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

尝试字符串“将图像放入我的画廊”,第一个将保持原样,而第二个将被替换。

其他人已经回答了如何达到想要的结果,所以这只是对原因的解释

于 2013-08-23T02:07:11.797 回答