Welcome

首页 / 软件开发 / C# / C#词法分析器(三)正则表达式

C#词法分析器(三)正则表达式2014-04-14正则表达式是一种描述词素的重要表示方法。虽然正则表达式并不能表达出所有可能的模式(例如“由等数量的 a 和 b 组成的字符串”),但是它可以非常高效的描述处理词法单元时要用到的模式类型。
一、正则表达式的定义

正则表达式可以由较小的正则表达式按照规则递归地构建。每个正则表达式 r 表示一个语言 L(r),而语言可以认为是一个字符串的集合。正则表达式有以下两个基本要素:

是一个正则表达式, L()=,即该语言只包含空串(长度为 0 的字符串)。

如果 a 是一个字符,那么 a 是一个正则表达式,并且 L(a)={a},即该语言只包含一个长度为 1 的字符串 a。

由小的正则表达式构造较大的正则表达式的步骤有以下四个部分。假定 r 和 s 都是正则表达式,分别表示语言 L(r) 和 L(s),那么:

(r)|(s) 是一个正则表达式,表示语言 L(r)∪L(s),即属于 L(r) 的字符串和属于 L(s) 的字符串的集合( L(r)∪L(s)={s|s∈L(r) or s∈L(s)})。

(r)(s) 是一个正则表达式,表示语言 L(r)L(s),即从 L(r) 中任取一个字符串,再从 L(s) 中任取一个字符串,然后将它们连接后得到的所有字符串的集合( L(r)L(s)={st|s∈L(r) and t∈L(s)})。

(r) 是一个正则表达式,表示语言 L(r),即将 L(r) 连接 0 次或多次后得到的语言。

(r) 是一个正则表达式,表示语言 L(r)。

上面这些规则都是由 Kleene 在 20 世纪 50 年代提出的,在之后有出现了很多针对正则表达式的扩展,他们被用来增强正则表达式表述字符串模式的能力。这里采用是类似 Flex 的正则表达式扩展,风格则类似于 .Net 内置的正则表达式: