美文网首页
javascript 死磕正则

javascript 死磕正则

作者: 9吧和9说9话 | 来源:发表于2020-03-01 21:48 被阅读0次

正则基础

  1. 正则的声明
    使用字面量: var reg =/abc/i
    使用构造函数:var reg = new RegExp('abc', 'i')
    区别:
    • 字面量在javascript解析阶段就会新建表达式,而构造函数会在运行时新建,前者效率会更高一些。
    • 前者会更直观一点。
    • 构造函数的方式 支持变量
  1. 正则对象实例的属性
//修饰符相关
reg.ignoreCase // 是否设置了i 修饰符,即是否忽略了大小写,默认值是false


// 修饰符无关
RegExp.prototype.lastIndex 下一此匹配开始搜索的位置
  1. 常用的方法
1. test(str)  
当前的模式 是否能匹配到字符串参数
如果正则中包含了g , 则从上一次结束的位置(lastIndex)开始匹配

var reg = /nice/g;
var str  = "niceone";
reg.test(str)// true
reg.test(str)// false


2. exec(str) 
返回值:一个数组
[匹配结果, 第一个分组的匹配结果, ...., index: 命中匹配的起始位置, ]

var reg = /nice(a)/g;
var str = 'niceasdfniceas';
reg.exec(str)// ["nicea", "a", index: 0, input: "niceasdfniceas", groups: undefined]

reg = /(nice(a))/g

reg.exec(str);
// 第一个分组是最外层的() 所以相比上面多了一个nicea
// ["nicea","nicea", "a", index: 0, input: "niceasdfniceas", groups: undefined]

注意点:

  1. test方法一样,如果有g全局搜索修饰符,lastIndex会后移
  2. 如果匹配失败,也是返回null

使用实例:
写一个formatter(tpl, data)函数,处理hi ${name}, ${user.age}字符串。
data = {name: 'ngnice', user: {age: 10}}

var data = {
        name: 'ngnice',
        user: {
            age: 10
        }
    }
    var reg = /\$\{(.*?)\}/g;
    console.log(formatter('hi ${name}, ${user.age}', data));

    function getValue(obj, keyPath) {
        var ret ='';
        try {
            ret = eval(obj+'.'+keyPath)
        } catch (err) {

        }
        return ret;
    }

    function formatter(tpl, data) {
        var match;
        var res = tpl;
        while (match = reg.exec(tpl)) {
            console.log(match);
            res = res.replace(match[0],getValue('data',match[1]));
        }

        return res;
    }

字符串中和正则相关的方法

  1. String.prototype.match 将所有匹配到的元素以数组的形式全部返回, 没有匹配到就返回null
  2. String.prototype.search 返回第一个匹配到的字符串在其中的索引, 没有的话 返回-1
  3. String.prototype.replace
xxx.replace(xxx, xxx);
// 可以之前匹配相关的字符进行替换
$&:匹配的子字符串。
$`:匹配结果前面的文本。
$’:匹配结果后面的文本。
$n:匹配成功的第n组内容,n是从1开始的自然数。
$$:指代美元符号$。

// 第二个参数可以是一个函数 将匹配到的字符替换成函数的返回值
xxx.replace(xxx, function replacer(match, $1, $2 ,..., index, input) {
  return $1;
})

模板引擎实现

参考:

  1. https://zhuanlan.zhihu.com/p/26269716
  2. 阮一峰 关于javascript中的正则介绍

相关文章

  • javascript 死磕正则

    正则基础 正则的声明使用字面量: var reg =/abc/i使用构造函数:var reg = new RegE...

  • javascript 死磕正则(2)

    先行断言、先行否定断言 中文翻译有点不好理解,原文是lookahead negetive lookahead lo...

  • “死磕”与学习

    也说“死磕” 死磕到底,死磕精神,死磕侠。互联网的发达,孕育了越来越多的网络词汇,“死磕”现在出现的频率颇高。 那...

  • 这些“死磕成本”的店,却因高体验卖出了惊人销量

    有些店死磕服务,有些死磕产品,还有些死磕成本。可有些品牌除了这些,还死磕别的... 无论何时,店铺的人工成本、租金...

  • 死磕与磕死

    前天晚上,打开百度网盘,准备听梁冬的节目睡睡平安,突然发现所有的音频转哪转哪,就是不出声音。到底哪里出了毛病?听听...

  • 磕,死磕

    疫情期间,你做的最多的是什么? 我啊~大概是反省吧,自省。 我发现反省是扇隐秘的门,一旦打开,就像探险一样,不停的...

  • 正则表达式

    JavaScript 正则表达式分很多种类型,首先最常见的是js里面的正则,下面讨论JavaScript的正则表达...

  • 死磕别人,不如死磕自己

    【死磕别人,不如死磕自己。】有朋友是干销售的,任凭那股子死磕别人的毅力,一切都是那么不可控,最后只剩毅力。与其死磕...

  • 原生js的基础方法等二

    JavaScript 正则表达式 正则表达式模式 调试 this JSON 字符串转换为 JavaScript 对...

  • “死磕”JavaScript 程序错误:Cannot use &

    问题再现 项目的背景:采用 react 系列 + ES6 + webpack。 今天编程时,JavaScript ...

网友评论

      本文标题:javascript 死磕正则

      本文链接:https://www.haomeiwen.com/subject/ffslhhtx.html