san.js源码解读之模版解析(parseTemplate)篇——readIdent函数

一、源码分析

/**
 * 读取ident
 * 这里的 ident 指标识符(identifier),也就是通常意义上的变量名
 * 这里默认的变量名规则为:由美元符号($)、数字、字母或者下划线(_)构成的字符串
 *
 * @inner
 * @param {Walker} walker 源码读取对象
 * @return {string}
 */
function readIdent(walker) {
    var match = walker.match(/\s*([\$0-9a-z_]+)/ig, 1)
, 1);

    // #[begin] error
    if (!match) {
        throw new Error('[SAN FATAL] expect an ident: ' + walker.source.slice(walker.index));
    }
    // #[end]

    return match[1];
}

readIdent 函数用来匹配 template 中用到的变量名(如下图)请添加图片描述

首先用到了 walk 类中的 match 函数,该函数源码如下(这里不是 walk 类全部代码而是列出了本次用到的代码)

/**
 * 字符串源码读取类,用于模板字符串解析过程
 *
 * @class
 * @param {string} source 要读取的字符串
 */
function Walker(source) {
    this.source = source; // 存储要解析的模版字符串
    this.len = this.source.length; // 获得字符串长度
    this.index = 0; // 初始话当前指针位置
}

/**
 * 向前读取符合规则的字符片段,并返回规则匹配结果
 *
 * @param {RegExp} reg 字符片段的正则表达式
 * @param {boolean} isMatchStart 是否必须匹配当前位置
 * @return {Array?}
 */
Walker.prototype.match = function (reg, isMatchStart) {
    reg.lastIndex = this.index; // 指定下一次匹配的起始索引

    // 如果匹配成功,exec() 方法返回一个数组,并更新正则表达式对象的 lastIndex 属性。完全匹配成功的文本将作为返回数组的第一项,从第二项起,后续每项都对应一个匹配的捕获组。
    var match = reg.exec(this.source);// exec() 可用来对单个字符串中的多次匹配结果进行逐条的遍历(包括捕获到的匹配),而相比之下, String.prototype.match() 只会返回匹配到的结果。
    if (match && (!isMatchStart || this.index === match.index)) {
        this.index = reg.lastIndex; // 更新下次匹配的起始索引
        return match;
    }
};

match 函数中主要用到了 exec 函数来进行正则表达式匹配,match 函数中需要注意一下几点

  1. 开始匹配之前对 lastIndex 进行赋值,在进行循环匹配时就形成了向前移动的指针。在每次匹配时开始的位置,
  2. isMatchStart 是一个必须匹配当前位置标识。当 isMatchStart 为 false 时,或者通过取反操作为 false时,就进行当前index和match.index进行相等比较,只有两者相等才可以是匹配当前位置,而其中 match.index 为‘匹配到的字符位于原始字符串的基于 0 的索引值’,this.index 在匹配的过程中也是动态更新的,所以可以使用两个值做比较。

在san中变量名由美元符号($)、数字、字母或者下划线()构成,为了匹配变量名给出如下正则表达式
请添加图片描述
上图可以看出变量名是如何匹配的,在 match 中 isMatchStart 表示为已经开启。为啥开启呐?下面看一下/\s*([$0-9a-z
]+)/ig,正则表达式如何匹配变量的

正确的变量命名
请添加图片描述

正确的变量命名它的index是从 0 开始的
请添加图片描述
不正确的变量命名是不是从 0 开始,也就是说 match.index 和 this.index 不相等。

注意:本例子中index是从0开始,在其他相关中可能不一样,但是如果isMatchStart标识开启了,那么match.index 和 this.index 必须相等

如果没有匹配到,则报错。如果匹配到就返回 match[1]即匹配到的值。
这里需要知道的是为啥是match[1] 而不是 match[0] 或者 [2]?这是因为 当exec 函数匹配成功,exec() 方法返回一个数组,并更新正则表达式对象的 lastIndex 属性。完全匹配成功的文本将作为返回数组的第一项,从第二项起,后续每项都对应一个匹配的捕获组。那么什么是捕获组呐?可以简单为正则表达式中使用括号‘()’括起来的就是一个捕获组,在匹配变量名表达式中可以看出([$0-9a-z_]+)是。所以是 match[1]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/107711.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EtherNet Ip工业RFID读写器与欧姆龙PLC 配置示例说明

一、准备阶段 POE交换机欧姆龙PLC 支持EtherNet Ip协议CX-Programmer 9.5配置软件 二、配置读卡器 1、打开软件 2、选择网卡,如果多网卡的电脑请注意对应所接的网卡,网卡名一般为“Network adapter Realtek PCIe GBE Family” 3、点击“选择网卡”&…

IP地址与代理ip在网络安全中的关键作用

目录 前言 一、IP地址在网络安全中的作用 1、网络流量监视和分析 2、网络安全事件响应 3、网络安全检测和防御 二、代理IP在网络安全中的作用 1、流量过滤和清洗 2、匿名访问和保护隐私 3、实现全球化业务 三、IP地址和代理IP在网络安全中的应用案例 1、DDoS攻击 2…

AI新能量!FortiGate NGFW面向数据中心全面集成FortiGuard AI 安全服务

企业IT技术正在以惊人的速度发展,转型最大的领域之一是下一代防火墙(NGFW)市场。如今,混合云、多云、边缘等多种基础设施形态共存,已经成为大部分企业的常态,不断扩张的攻击面需要不同形态防火墙的安全防护…

Spring Security漏洞防护—HttpFirewall和 HTTPS

一、HttpFirewall Spring Security有几个领域,你所定义的 pattern 会针对传入的请求进行测试,以决定应该如何处理请求。这发生在 FilterChainProxy 决定请求应该通过哪个过滤链时,以及 FilterSecurityInterceptor 决定哪些安全约束适用于请求…

守牢底线——建行驻江门市分行纪检组举办2023年清廉合规大讲堂

为推动廉洁教育打通“最后一公里”,近日,建行驻江门市分行纪检组举办江门市分行2023年清廉合规大讲堂。 本次大讲堂邀请了检察院资深检察官专题讲授《金融从业人员易涉犯罪问题剖析及预防》,检察官结合一线办案经历,从防范化解金…

从零开始的LINUX(三)

bc:进行浮点数运算 uname:查看当前的操作系统 ctrlc:中止当前正在执行的程序 ctrld:退出xshell shutdown:关机 reboot:重启 shell外壳: 作用:1、命令解释(将输入的程序…

039-第三代软件开发-PDF阅读器

第三代软件开发-PDF阅读器 文章目录 第三代软件开发-PDF阅读器项目介绍PDF阅读器1 初始化PDF view2 qml 中使用3 创建模块 关键字: Qt、 Qml、 pdf、 LTDev、 本地 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Met…

【vue3】样式穿透、完整新特性、动态css、css-module

一、样式穿透 vue2里面使用 /deep/ vue3里面使用 :deep() :deep(.el-input__inner){background-color: red; }二、完整新特性 :slotted() //parent.vue <template><div><p>这是父级</p><span></span><A><p class"red"…

[每周一更]-(第69期):特殊及面试的GIT问题解析

整合代码使用过程的问题&#xff0c;以及面试遇到的细节&#xff0c;汇总一些常用命令的对比解释和对比&#xff1b; 1、fetch和pull区别 git fetch是将远程主机的最新内容拉到本地&#xff0c;用户在检查了以后决定是否合并到工作本机分支中。 git pull则是将远程主机的最新内…

【Docker】联合探讨Docker:容器化技术的革命性应用

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

8.自定义组件布局和详解Context上下文

pages/index.vue layout布局运行在服务端 1、在项目的目录下新建layout文件夹&#xff0c;并新建一个blog.vue布局文件 2、在页面中的layout函数里&#xff0c;返回刚才新建布局文件的名字blog就可以使用了 export default {...layout (context) {console.log(context)retu…

ElasticSearch(ES)8.1及Kibana在docker环境下如何安装

ES基本信息介绍 Elasticsearch&#xff08;简称ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;最初由Elastic公司创建。它属于Elastic Stack&#xff08;ELK Stack&#xff09;的核心组件之一&#xff0c;用于实时地存储、检索和分析大量数据。 以下是Elastics…

37基于MATLAB平台的图像去噪,锐化,边缘检测,程序已调试通过,可直接运行。

基于MATLAB平台的图像去噪&#xff0c;锐化&#xff0c;边缘检测&#xff0c;程序已调试通过&#xff0c;可直接运行。 37matlab边缘检测图像处理 (xiaohongshu.com)

【蓝桥每日一题]-前缀和与差分(保姆级教程 篇2)#差分序列

昨天讲的概念和模板&#xff0c;今天讲一个差分序列的好题(好好体会里面的优化思想)&#xff1a; 目录 题目&#xff1a; 思路&#xff1a; 题目&#xff1a; 手动打出样例哈 输入&#xff1a; 输出&#xff1a; 4 …

吴恩达《机器学习》2-1:模型描述

一、单变量线性回归 单变量线性回归是监督学习中的一种算法&#xff0c;通常用于解决回归问题。在单变量线性回归中&#xff0c;我们有一个训练数据集&#xff0c;其中包括一组输入特征&#xff08;通常表示为&#x1d465;&#xff09;和相应的输出目标&#xff08;通常表示为…

QT中文乱码解决方案与乱码的原因

相信大家应该都遇到过中文乱码的问题&#xff0c;有时候改一改中文就不乱码了&#xff0c;但是有时候用同样的方式还是乱码&#xff0c;那么这个乱码到底是什么原因&#xff0c;又该如何彻底解决呢&#xff1f; 总结 先总结一下&#xff1a; Qt5中&#xff0c;将QString()的构…

设计模式【Iterator 模式】

Iterator 模式 1.什么是 Iterator 模式 Iterator 模式就是按照顺序遍历数据集合。 2.示例程序 1.Aggregate 接口 Aggregate 接口是要遍历的集合的接口&#xff0c;声明方法 iterator &#xff0c;实现了该接口的类可以通过 iterator 方法遍历数据集合的元素。 public int…

ab压力测试

标题相关概念 QPS&#xff0c;每秒查询 QPS&#xff1a;Queries Per Second意思是“每秒查询率”&#xff0c;是一台服务器每秒能够相应的查询次数&#xff0c;是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 互联网中&#xff0c;作为域名系统服务器的机…

论文阅读——DistilBERT

ArXiv&#xff1a;https://arxiv.org/abs/1910.01108 Train Loss: DistilBERT&#xff1a; DistilBERT具有与BERT相同的一般结构&#xff0c;层数减少2倍&#xff0c;移除token类型嵌入和pooler。从老师那里取一层来初始化学生。 The token-type embeddings and the pooler a…

Spring Cloud Sentinel整合Nacos实现配置持久化

sentinel配置相关配置后无法持久化&#xff0c;服务重启之后就没了&#xff0c;所以整合nacos&#xff0c;在nacos服务持久化&#xff0c;sentinel实时与nacos通信获取相关配置。 使用上一章节Feign消费者服务实现整合。 版本信息&#xff1a; nacos:1.4.1 Sentinel 控制台 …