js下的单词替换

项目中碰到一个要替换单词的功能,需求是:可以将产品标题中的某一单词替换成另外的单词,如果替换词不填就替换为空。

这个需求设计到的具体细节是,前后有空格的单词,或者字符串首尾的单词可以被替换,举例

1、"word wordword word"  该单词中如果被替换词为word,替换词为letter 则结果是 "letter wordword letter" 也就是说中间这个单词虽然也包含了word但是不能被替换,替换的只是前后有空格的

2、"word-word word word" 该单词中如果被替换词为word,替换词为letter 则结果是 "word-word letter letter" 也就是说第一个单词虽然也包含了word但是不能被替换,替换的只是前后有空格的

好吧接下来就开始实现了,先定义一个字符串 var title = 'word hello word hello world word';

现在来分析下,既然要做替换,肯定要找出被替换的词,且必须是符合规则的,这样按照正常的理解是找出前后有空格,或者字符串首尾的单词 进行替换就可以了。

第一次写下最初的正则var newTitle = title.replace(/(^|\s)word($|\s)/g, '$1letter$2');

这里为什么要在替换的新词前后加$1 $2呢?因为上面的正则匹配出来的包含了空格,也就是空格也会被替换掉,所以后面必须加上$1与$2已保证空格被恢复。

这样貌似没问题了,且针对上面字符串确实没问题了,但是问题来了,测试的时候发现如果改动一下字符串 'word word hello word hello world word',这样开始处的两个word中只有前面一个能被替换掉,第二个不会被替换,因为前面一个被匹配到字符串的开头,后面也有一个空格,因此可以;而第二个单词word匹配的时候会在第一个基础上再找,然后发现前面没空格,也不是字符串开头,因此不能被匹配。而且该问题只会出现在两个相同单词相邻的情况下。没办法再另寻方式吧

第二次想想要不直接匹配单词,匹配符合条件的那个单词,而不是像上面那样的把空格也匹配进来了,结果还需在替换的时候加上$1 $2,经过考虑写下下面的

 var newTitle = title.replace(/(?<=^|\s)word(?=$|\s)/g, 'letter');这边意思替换前面是空格或字符串开头,后面是空格或字符串结尾的那个单词,不会匹配到空格

但是貌似js 不支持这种后瞻查找,因此失败了。算了既然不支持后瞻,那就不用后瞻,保持前瞻好了

第三次写下var newTitle = title.replace(/(^|\s)word(?=$|\s)/g, '$1letter'),OK这次总算可以了。

 

posted @ 2012-05-10 14:32  自由小菜园  阅读(1444)  评论(0编辑  收藏  举报