尝试使用RegEx交换两个字符串

时间:2014-10-17 07:30:42

标签: javascript regex

假设我有一个这样的字符串:

my favorite berry is the blueberry, not the strawberry or berryfruit

我想查找berryblueberry的所有实例,其中每个实例都是一个孤立的单词,而不是一个较长单词的子字符串,并将每个实例更改为另一个,以获得此结果:

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;。

0 个答案:

没有答案