正规式
定义
也叫正则表达式(regular expression,常简写为RE或regex)。是计算机科学标准化的成就之一。描述了一种字符串的模式。
形式上正则表达式是用于表征一组字符串的代数表示法。
构建
由较小的正则表达式按照特定规则递归地构建。
每个正则表达式r定义一个语言。这个语言也是根据r的子表达式所表示的语言递归定义的。
正规式与正规集
字母表∑上的正规式和正规集递归定义如下:
归纳基础
ε和φ都是∑上的正规式,它们所表示的正规集分别为{ε}和 φ。其中:ε为空字符串,φ为空集。
任意元素a∈∑,a是∑上的一个正规式,它所表示的正规集是{a}。
归纳步骤:假定R和S都是∑上的正规式,所表示的正规集记为L(R)和L(S),由小正则表达式生成大的正则表达式的规则如下。
选择:(R | S) 是正规式,正规集为L(R)∪L(S)
连接:(R · S) 是正规式,正规集为L(R)L(S)
闭包:(R)* 是正规式,正规集为(L(R))*
(U) 是正规式,正规集为L(U)
仅由有限次使用上述步骤得到的表达式才是∑上的正规式,它们表示的集合是∑上的正规集。
注:n正则式是一个表达式,正规集是一个集合。
例:已知∑={a, b} ,下列正规式相应的正规集是什么?
正规式 | 正规集 |
ba* | 所有以b为首,后跟任意多个a的字符串 |
a(a|b)* | 所有以a为首的字符串 |
(a|b)*(aa|bb)(a|b)* | 所有含有两个连续的a或连续的b的字符串 |
非确定的有限自动机——NFA
定义
一个非确定的有限自动机(NFA)M 是一个五元组: M = ( S, Σ, δ, S0, F ),其中:
(1)S和 Σ的定义同前;
(2)δ: S × {Σ ∪ ε} →2S(状态子集);
对于某个状态s ⊆ S 和一个输入字母a:
δ(s, a)=S’⊆ S
(3)S0 ⊆ S为非空初态集;
(4)F ⊆ S为终态集
Thompson算法 : RE -->NFA
基础规则
1. 对于 ε,构造为
2. 对于a (输入的字符以a为例),构造为
一个圆圈前加一个箭头表示初始状态,两个圆圈表示终结状态,中间用箭头连接,箭头上标明要输入的字符
归纳规则
1. 对于 a | b,构造为
2. 对于 ab,构造为
3. 对于 a* = a^n | ε,构造为
1.增加一个新的开始状态和一个新的结束状态。
2.将新的开始状态指向原来所有的开始状态。原来的终结状态指向新的终结状态。弧上为 ε 。
例题
设正则表达式 1*0(0|1)*, 构造等价的NFA