javascript - 为什么这个 replace() 不替换 "my"?

标签 javascript regex

有人可以解释为什么下面的 replace() 没有替换“my”

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

有一个 jsfiddle here .

谢谢。

最佳答案

因为匹配器已经提前了。匹配不能重叠,所以 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 anchor 在单词边界而不是空格处匹配(@Grim 的解决方案)。

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

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

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

关于javascript - 为什么这个 replace() 不替换 "my"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18393428/

相关文章:

java - 如何使用模式中的变量来替换所有除外?

javascript - 如何防止空输入?

PHP strtotime 和 JavaScript Date.parse 返回不同的时间戳

javascript - preg_match_all 获取除 tabmanager 脚本之外的所有脚本选项卡

java - 输入文本文件上的正则表达式 float

regex - (Notepad++) 用正则表达式 : FixedText(xxx[yyy], 替换为固定文本(yyy, xxx[yyy],whatever)

javascript - 尝试将 json 对象从 javascript 发布到 php

javascript - 简单的?关于如何在 Javascript 中清除 clearInterval() 的问题

javascript - 从点到圆 Angular 矩形或椭圆的最长距离

javascript - 正则表达式(或不)用动态变量替换所有匹配项