JS中使用正则替换

796 阅读3分钟

一直以为没有机会用,但是在仿vue2.0的mvvm模式时,有一个纯文本替换其中的{{expr}}为目标value的操作。直接抄别人写的不过瘾(其实是我自己打断点调试时,发现别人写的处理的还是不太到位),还是自己再复习一把。

1.RegExp

RegExp是JS内置的对象。正则对象 创建一个RegExp两种方式

  • new RegExp(patter,attributes)

参数 attributes 是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。

new RegExp("a")匹配一次字符串
new RegExp("a","g") 全局匹配a字符串,多次匹配
  • 字面量
/a/ 匹配一次字符串
/a/g 全局匹配a字符串,多次匹配

观察一下RegExp的实例化属性是什么准确的类型 。是一个"[object RegExp]"

Object.prototype.toString.call(/a/)
"[object RegExp]"

2.RegExp.prototype.test()

regexObj.test(str) 参数:目标字符串 返回值:是否匹配成功Boolean

/abc/.test("qabcqqq")  true

总结: 主要就是用来判断字符串是否有符合匹配的正则

3.String.prototype.match()

这是字符串提供的匹配方法 语法

str.match(searchStr)匹配普通字符串
str.match(regexp)匹配正则表达式

3.1 str.match(searchStr)

如果匹配的是普通字符串"qwer".match("w")类似于indexOf 和lastIndexOf 。

区别:

  • indexOf 和lastIndexOf返回的是匹配的索引值,如果没有匹配成功返回-1
  • match匹配成功返回的是一个数组。失败返回null。成功的数组索引0就是匹配的searchStr。数组的index属性才是匹配成功字符串所在的索引值。(说实话,个人感觉没有indexOf好用)

3.2 str.match(regexp)

匹配的是正则表达式。匹配正则时,会根据是否有g全局匹配还出现不同的返回值

  • 正则没有g属性时,和匹配普通字符串返回结果一直。有则返回一个数组,无则返回null
  • 正则带有g全局匹配时。返回结果也是一个数组,但是数组中的值。是出现了几个searchStr。匹配不成功就是null

总结:个人感觉字符串的match方法用的确实少。

4 String.prototype.replace()

语法:第一个参数是需要替换的oldStr.第二参数是替换后的newStr。不会改变原字符串,返回全新字符串

str.replace(regexp|substr, newSubStr|function)

第二个参数为函数时,函数的参数。你可以自己打断点或者console看看

解决问题:抽离纯文本中的{{}}替换为对应的值

   let data = {
        msg: "这是一条消息",
        age: 18,
        flag: true,
        person: {
          name: "武汉加油"
        }
      };
      //目标文本
      let str =
        "消息:{{msg}}年龄:{{age}}:真还是假:{{flag}}:地区姓名:{{person.name}}";
      function exec(str) {
        // 记得全局匹配。记得多行匹配。.* 为贪婪匹配,我不能不需要。所以.*? 非贪婪匹配
        let reg = /\{\{(.*?)\}\}/g;
        let newStr = str.replace(reg, function(...args) {
          // 替换匹配的{{}}为最新的值
          return getVal(args[1], data);
        });
        return newStr;
      }
      // 根据表达式和数据。返回指定的值. expr:msg   return "这是一条消息"
      function getVal(expr, data) {
        // 根据表达式返回最新的值
        return expr.split(".").reduce((data, item) => {
          return data[item];
        }, data);
      }
      // 执行
      let newStr = exec(str);
      console.log(newStr);//消息:这是一条消息年龄:18:真还是假:true:地区姓名:武汉加油

强大:只要你厉害,这个可以玩出花

参考

学习的话,基本语法什么掘金有很多文章,就不贴出来。 juejin.cn/post/684490…正则表达式真的很骚,可惜你不会写!!! developer.mozilla.org/zh-CN/docs/…MDN

工具

regexper.com/ 解析正则表达式.尤大推荐的