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

Ste*_*eve 1 javascript regex

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

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

有一个的jsfiddle 这里.

谢谢.

Fab*_*tté 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"
Run Code Online (Sandbox Code Playgroud)

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

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

'put image in my gallery'.replace(/\b(?:my|in) /g, '');
//'put image gallery'
Run Code Online (Sandbox Code Playgroud)

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