• 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这次总算可以了。

  • 相关阅读:
    mdx 根据维度Hierarchy节点的名字来filter节点,搜索节点
    学习C++.Primer.Plus 8 函数探幽
    学习C++.Primer.Plus 7 函数
    学习C++.Primer.Plus 6 分支语句和逻辑操作符
    学习C++.Primer.Plus 5 循环和关系表达式
    学习C++.Primer.Plus 4 复合类型
    NYoj_171聪明的kk
    NYoj_104最大和
    希尔排序
    NYoj_49开心的小明
  • 原文地址:https://www.cnblogs.com/fuyun2000/p/2494309.html
Copyright © 2020-2023  润新知