深入浅出词法分析(正则表达式)
基本概念
- 词法分析器的主要任务:读入源程序的输入字符,将他们组成词素,生成并输出一个词法单元序列,每一个词法单元对应于一个词素。
词法分析器还要过滤源程序中的注释和空白和注释
还要将编译器生成的错误消息与源程序的位置联系起来
- 词法分析器将其转为token的序列,语法分析器每次从词法分析器获得一个token,对不同的token的处理也不同
- token词法:带有附加信息的字符串
- lexeme词素:单纯的字符串
- 关键字/保留字:预先指定的单词(程序语言的关键字如if else等)
- 标识符:非关键字的以字母开头的字母或数字序列
语言
语言上的运算
Kleene闭包与正闭包区别:正闭包不包含 (空串)
例子
L为A-Z的字母串
M为0-9的数字串
LM:包含36个字母或数字的串
LM:包含26 10个长度为2的串(每个串都是一个字母跟一个数字)
:所有有字母构成的串的集合,包括空串
:所有由四个字母构成的串的集合
:所有以字母开头,字母和数字组成的串的集合
正则语言(Regular Language)
描述词素——正则表达式
- 是一个正则表达式, ,该语言只包含空串
- 如果 是 上的一个符号,那么a是一个正则表达式,并且L(a)={}
是一个符号 a是正则表达式
-
正则表达式与语言运算的对应
-
正则表达式的运算级: 》 连接运算符 》 |
-
正则集合(正则表达书等价,与代数定律中的交换律,结合律相似)
正则定义( Regular Definition )
简单来说就是将一些正则表达式命名为 , 符号等等,然后由这些符号就构成的集合
例子——c语言的标识符
正则表达式的扩展
- 字符类:表示字母或数位时可以用连词符-缩写
[abc]=a|b|c
[a-z]=a|b|…|z
[0-9]=0|1|…|9 - ^:可表示非的意思
[^abc]表示匹配出a b 或c外的任意字符 - ^在[ ]外表示匹配开头
^ab表示匹配以ab开头的 - $或\b表示匹配结尾
ab$ ,ab\b表示ab结尾的 - i 表示忽略大小写
//两条斜线之间的是正则文体,表示匹配abc或者ABC
/^abc/i
- g:正则一般匹配到第一个就结束,加上全局修复符可以匹配到结束
- m 让^和$匹配行首和结尾 (\n)
- \s表示匹配空白字符,包括空格,制表符,换页符等
- 单目后缀运算符*: 匹配0-n次
- 单目后缀运算符+:表示一个正则表达式及其语言的正闭包(不包含空串 ) (匹配1-n次)
= |
= = (开头或者结尾有一个L 即不为空串) - 单目后缀运算符?:表示零个或一个出现(匹配0次或1次)非贪婪模式
- {n}匹配n次
a{2}表示匹配aa - {m,n}表示匹配m到n次
a{1,3}表示匹配 a|aa|aaa - {m,}表示匹配次
a{3,}表示匹配aaa… - 转义符\,引用的语法:\数字表示引用前面的第几个捕获分组
<(div)><\/\1>可以匹配 <div></div> - 不以ab字符串为开头的字符串,可以这样写^(?!ab)[a-z]+$