形式语言与自动机第四章 正则表达式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
形式语言与自动机
第四章 正则表达式
南京航空航天大学 计算机科学与技术学院
袁伟伟 yuanweiwei@nuaa.edu.cn
1
第四章 正则表达式
1.1 正则表达式的定义 1.2 正则表达式和有穷自动机的关系 1.3 正则表达式的等价变换
2
1.1 正则表达式定义
正则表达式(Regular Expression:Regex)的由来
Ken Thompson 是 Unix 的主要发明人;正则表达式的第一 个实用应用程序就是 Unix 中的 qed 编辑器;
Jeffrey Friedl 在其著作《Mastering Regular Expressions 》(中文版译作:精通正则表达式,第三版)
3
正则表达式示例
例4.1 在字母表{0,1}上,0*1+1*0表示:
φ {ε} {a} {b} {a,b} {ab} {a}* {a,b}* {a}{b}* {a}*{b}{a}*
6
正则表达式表示的约定
为了尽量减少括号,做如下的约定:
(1)每个正则表达式最外层的一对括号可以省略。
(2)规定正则表达式构造的优先次序为:
①*
最高级
② 连接(如 rs )
次高级
③+
最低级
4
正则表达式的递归定义
定义 4.1 设∑是一个字母表,∑上的正则表达式以及由它 们代表的集合,递归定义如下:
(1) 是一个正则表达式,代表空集。
(2) ε是一个正则表达式,代表集合{ε}。 (3) 对于∑中每个符号a , a是正则表达式,代表集合{a}。 (4) 百度文库果r和s是正则表达式,分别代表集合R和S,则 (r+s),(rs)和(r*)是正则表达式,分别代表集合R∪S, RS和R* 。
正则表达式R代表的字符串集合记为L(R)。
5
正则表达式示例
例4.3 给出∑={a,b},则对∑上的一些正则表达式与它们各自所 代表的集合列表示于图4.1中:
正则表达式r 代表的集合L(r)
φ ε a b (a+b) (ab) (a*) ((a+b)*) (a(b*)) ((((a*)b)(a*)))
字符串可以划分为长度为2或3的子串
e ✓ 1 ✗ 10 ✓ 011 ✓ 00110 ✓ 011010110 ✓
包括了所有的字符串,除了长度为1的串
((0+1)(0+1)+(0+1)(0+1)(0+1))*
= 除了0,1之外的所有的字符串
13
正则表达式 ---> 字符串集合
(1+01+001)*(e+0+00)
所有字符串长度是偶数或3的倍数 = 串长为 0, 2, 3, 4, 6, 8, 9, 10, 12, ...
((0+1)(0+1))* (0+1)(0+1)
((0+1)(0+1)(0+1))* (0+1)(0+1)(0+1)
串长为偶数 串长为2
串长为3的倍数 串长为3
11
正则表达式 ---> 字符串集合
凡是符合此种顺序的,括号可以省略。
(3)同一种构造(如同为 +,连接或 *)连续出现时,规定从左到右依
次构造,中间的括号可以省略。
例如((0(1*))+0)就可写成01*+0,((a*)(b)(a*))就可写成 a*ba*。但是,(a+b)* 不可写成a+b*,因为前者表示先构造(a+b),后 构造(a+b)*,结果代表集合{a,b}*;而后者根据优先次序的约定,表示 先构造b*, 再构造a+b*,结果代表集合{a,{b*}};这两个集合显然是不 相等的。
最多两个 0 在两个1之间的最多只有两个0;
永远不能出现连续的三个0 结论:(1+01+001)*(e+0+00) = {x:|x 不包含子串 000}
((0+1)(0+1)+(0+1)(0+1)(0+1))*
字符串可以划分为长度为2或3的子串
(0+1)(0+1)+(0+1)(0+1)(0+1) (0+1)(0+1) (0+1)(0+1)(0+1)
长度为2或3的串 长度为2的串 长度为 3的串
12
正则表达式 ---> 字符串集合
((0+1)(0+1)+(0+1)(0+1)(0+1))*
0+1 = {0, 1}
长度为1的字符串集合
(0+1)* = {e, 0, 1, 00, 01, 10, 11, …}
任意的字符串
(0+1)*010
以 010 结尾的字符串
(0+1)*01(0+1)*
包含 01 的所有字符串集合
10
正则表达式 ---> 字符串集合
((0+1)(0+1))*+((0+1)(0+1)(0+1))*
8
正则表达式 ---> 字符串集合
S = {0, 1}
01* = 0(1*) = {0, 01, 011, 0111, …}
0 后面跟上任意多个1
(01*)(01) = {001, 0101, 01101, 011101, …} 0后面跟上任意多个1,然后以01结尾
9
正则表达式 ---> 字符串集合
人类神经系统如何工作的早期研究: Warren McCulloch 和 Walter Pitts 两位神经生理学家研究出一种数学方式来描述这 些神经网络;
1956 年, 一位Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了标题为“神经网事件的表示法 ”的论文,引入了正则表达式的概念;
7
正则表达式的示例
例4.5 构造一个正则表达式,使它能代表如下的集合S:S的每个 元素都是倒数第十个字符是1的0、1串。
即使构造一个NFA接受这个S,也要设11个状态和20个δ函数,若 是用DFA那就更复杂了。
要用一个正则表达式来代表S,就简单多了: (0+1)*1(0+1)(0+1)(0+1)(0+1)(0+1)(0+1)(0+1)(0+1)(0+1)
出现若干个0后以一个1结尾,或者出现若干个1后以一个0结尾的一切字符 串的集合。
用集合的表示形式就是{0}*{1}∪{1}*{0};
例4.2 在字母表{a,b}上,(a+b)*aaa(a+b)*表示:
字符串中至少要连续出现三个a。 用集合的表示形式就是{a,b}*{aaa}{a,b}*
正则表达式和它所代表的集合形式上有很大的相似性。大致上,正则 表达式的“+”相当于集合中的并运算符“∪”,正则表达式的“*”与集合 中的闭包运算符一致,正则表达式的“连接”相当于集合的连接运算。
相关文档
最新文档