主要内容:

背景知识

JavaScript 和 正则

表达式的匹配原理

背景知识

1.起源

关于正则表达式,最初的想法来自20世纪40年代的两位神经科学家, Warren McCulloch 和 Walter Pitts,他们研究出一种模型,认为神经系统在神经元层面上就是这样工作的。若干年后,数学家 Stephen Kleene 在代数学中正式描述了这种被他称为“正则集合”(regular sets)的模型,正则表达式才成为现实。Stephen 发明了一套简介的表示正则集合的方法,他称之为“正则表达式”(regular expressions)

2.流派(flavor)

不同工具,不同语言,支持的元字符等特性各有不同;(即使支持的元字符相同,不同流派中,对元字符的理解也可能不同)

JavaScript 和 正则

使用正则表达式的方法:

方法 描述
exec 返回一个数组(未匹配到则返回null)
test 返回true或false
match 返回一个数组或者在未匹配到时返回null
search 返回匹配到的位置索引,或者在失败时返回-1
replace 使用替换字符串替换掉匹配到的子字符串
split 使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的String方法

支持的参数

参数 描述
i 忽略大小写
m 让开始和结束字符(^ 和 $)工作在多行模式 demo
g 全局匹配 demo
y sticky 粘滞 demo demo


兼容性视图

表达式的匹配原理

正则引擎的分类

DFA

传统型 NFA

POSIX NFA

eg

两条普世原则:

1.优先选择最左端(最靠开头)的匹配结果

2.标准的匹配量词 * + ? {m,n} 是匹配优先的

正则表达式的应用原理:

1.正则表达式编译:检查正则表达式的语法正确性,如果正确,就将其编译为内部形式(internal form)

2.传动开始:传动装置将正则引擎“定位”到目标字符串的起始位置。

3.元素检测:引擎开始测试正则表达式和文本,依次测试正则表达式的各个元素

4.寻找匹配结果:如果找到一个匹配结果,传统型NFA会“锁定”在当前状态,报告匹配成功

5.传动装置的驱动过程:如果没有找到匹配,传动装置就会驱动引擎,从文本中的下一个字符开始新一轮的尝试(回到步骤3)

6.匹配彻底失败:如果从目标字符串的每一个字符(包括最后一个字符之后的位置)开始的尝试都失败了,就会报告匹配彻底失败。

backtracking.png

回溯的陷阱

多选结构的陷阱

多选结构的陷阱

性能问题

常识性优化

避免重新编译

使用非捕获型括号 (?: )

不要滥用括号 (.)*

不要滥用字符组 ^.* [:]

使用起始锚点

一些关于优化的关键字

Q&A

THANK U

Powered By nodePPT v1.2.3