正则表达式是一种描述词素的重要表示方法。虽然正则表达式并不能表达出所有可能的模式(例如“由等数量的 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 内置的正则表达式: