有人可以解释为什么下面的 replace() 不能替换“我的”
$(function() {
var str = "put image in my gallery";
str = str.replace(/ my | in /g, " ");
});
这里有一个jsfiddle 。
谢谢。
有人可以解释为什么下面的 replace() 不能替换“我的”
$(function() {
var str = "put image in my gallery";
str = str.replace(/ my | in /g, " ");
});
这里有一个jsfiddle 。
谢谢。
因为匹配器已经前进了。匹配项不能重叠,因此 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
),这样匹配就不会重叠,并且执行替换后没有多余的空格。当然,这只是给你一个想法,具体的用例(例如涉及标点符号)将需要更专业的正则表达式。
我建议使用:
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/
将您的功能更改为:
$(function() {
var str = "put image in my gallery";
str = str.replace(/ my( |\,|\.|\?)/g, " ").replace(/ in( |\,|\.|\?)/g, " ");
console.log(str);
});
将“in”替换为“”会修改“my”之前的空格,因此它之前的空格已经被视为已处理,并且在空格之后继续替换。
尝试字符串“将图像放入我的画廊”,第一个将保持原样,而第二个将被替换。
其他人已经回答了如何达到想要的结果,所以这只是对原因的解释。