假设我有一个这样的字符串:
my favorite berry is the blueberry, not the strawberry or berryfruit
我想查找berry
和blueberry
的所有实例,其中每个实例都是一个孤立的单词,而不是一个较长单词的子字符串,并将每个实例更改为另一个,以获得此结果:
my favorite blueberry is the berry, not the strawberry or berryfruit
当然,我不能这样做:
str=str.replace(/blueberry/g,"berry");
str=str.replace(/berry/g,"blueberry");
因为这只会改变所有"浆果"子串到"蓝莓"。
我尝试过以下代码:
<div id="displayDiv"></div>
<script type="text/javascript">
function replaceSeparateInstances(inputStr,findStr,replaceStr){
var re=new RegExp("^"+findStr+"(?!\w)|^"+findStr+"$|[\\W\\s]"+
findStr+"(?!\w)|[\\W\\s]"+findStr+"$","g");
return inputStr.replace(re,replaceStr);
}
function berryBlueberrySwap(inputStr){
var result=replaceSeparateInstances(inputStr,"blueberry","abc");
result=replaceSeparateInstances(result,"berry","xyz");
result=result.replace(/abc/g,"berry");
result=result.replace(/xyz/g,"blueberry");
return result;
}
var div=document.getElementById("displayDiv");
var content="my favorite berry is the blueberry, not the strawberry or berryfruit";
div.textContent=berryBlueberrySwap(content);
</script>
这有几个问题:
空格正在被replaceSeparateInstances()
替换的单词的左侧删除,因为Javascript中没有负面的背后隐藏。我已经看过一些关于如何为此做一个解决方法的SO帖子,但我无法弄清楚如何将它们应用于replace()
。
此解决方案依赖于将两个字符串更改为临时字符串&#34; abc&#34;和&#34; xyz&#34;,如果这些字符串实际存在于文本中,则会出现问题。
&#34;浆果&#34;在&#34; berryfruit&#34;正在被正则表达式找到,并且它不应该被找到,因为&#34; f&#34;在&#34; berry&#34;的右边是一个\w
字符。
有更好的方法吗?
编辑:我尝试使用重复链接中描述的功能,如下所示:
function switchInstances(inputStr,findStr1,findStr2){
var findStr="("+findStr1+"|"+findStr2+")";
var re=new RegExp("^"+findStr+"(?!\w)|^"+findStr+"$|[\\W\\s]"+
findStr+"(?!\w)|[\\W\\s]"+findStr+"$","g");
console.log(re.source);
return inputStr.replace(re,function($1){
return $1===findStr1 ? findStr2 : findStr1});
}
function berryBlueberrySwap(inputStr){
var result=switchInstances(inputStr,"berry","blueberry");
return result;
}
但是这产生了这个输出:
my favoriteberry is theberry, not the strawberry orberryfruit
所以我仍然有看后卫的问题,现在&#34;浆果&#34;并没有变成&#34;蓝莓&#34;。