每个正则表达式 r r r表示一个语言 L ( r ) L(r) L(r),以下给出正则表达式的归纳定义
归纳基础
- ϵ \epsilon ϵ是一个正则表达式, L ( ϵ ) L(\epsilon) L(ϵ)={ ϵ \epsilon ϵ},即该语言只包含空串
- 如果 a a a是 Σ \Sigma Σ上的一个符号,那么 a \bf a a是一个正则表达式,并且 L ( a ) L(\bf a) L(a)={ a a a}
归纳步骤
假定 r r r和 s s s都是正则表达式,那么:
- ( r ) ∣ ( s ) (r) | (s) (r)∣(s)是一个正则表达式,表示语言 L ( r ) ⋃ L ( s ) L(r) \bigcup L(s) L(r)⋃L(s)
- ( r ) ( s ) (r)(s) (r)(s)是一个正则表达式,表示语言 L ( r ) L ( s ) L(r)L(s) L(r)L(s)
- ( r ) ∗ (r)* (r)∗是一个正则表达式,表示语言 ( L ( r ) ) ∗ (L(r))* (L(r))∗
- ( r ) (r) (r)是一个正则表达式,表示语言 L ( r ) L(r) L(r),即表达式两边加括号不影响所表示的语言
优先级约定
按照上面定义,正则表达式会包含不必要的括号,以下优先级约定可减少括号
- 一元运算符 ∗ * ∗具有最高优先级,并且是左结合的
- 连接运算符具有次高优先级,它也是左结合的
- ∣ | ∣ 的优先级最低,也是左结合的