javascript 死磕正则

正则基础

  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中的正则介绍
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,791评论 0 3
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,667评论 0 4
  • 自从年前得空写了两篇文章之后就开始忙了,这一忙就是2个月😭。当时信誓旦旦说的定期写篇博客的计划也就泡汤了🤣,不过好...
    景科同学阅读 1,255评论 0 9
  • JS基础 页面由三部分组成:html:超文本标记语言,负责页面结构css:层叠样式表,负责页面样式js:轻量级的脚...
    小贤笔记阅读 673评论 0 5
  • 今天早上妈妈的手机“嘟嘟”响了好几声,我心想:咦?这是谁呀?这么喜欢发微信,然后便打开手机,映入眼帘的是我们...
    万彬浩阅读 299评论 0 2

友情链接更多精彩内容