第三章 2-正则表达式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.3 正则表达式
广东商学院信息学院 胡建军
正则表达式
描述程序设计语言中单词的一种简单而 且数学化的工具。 且数学化的工具。 表示符号串的构成模式 正则表达式r定义了一个符号串集合r 正则表达式r定义了一个符号串集合rs, 内的每个符号串都与r rs内的每个符号串都与r所定义的模式相 匹配, 称为由r生成的语言L(r) 匹配,rs称为由r生成的语言L(r) 正则表达式中出现的所有符号构成的集 合为该正则表达式的字母表 字母表, 合为该正则表达式的字母表,用Σ表示
正则表达式
主要内容: 主要内容: 基本概念 正则表达式定义及一些性质 扩充的正则表达式及程序设计语言中 单词的定义 正则表达式的局限性。 正则表达式的局限性。 正则定义
正则表达式(正规式) 正则表达式(正规式)
基本概念: 基本概念: 字母表:非空有限集, 其元素称为符号或字母. 字母表:非空有限集,∑,其元素称为符号或字母. 符号串:符号的有限序列,也称为‘ 符号串:符号的有限序列,也称为‘字’。λ或ε表示 空串 空串集{ 不同于空集∅ 空串集{λ}不同于空集∅ 。 符号串长度:符号串中字符的个数.| .|β 符号串长度:符号串中字符的个数.|β| 符号串连接: 都是符号串, αβ为符号串的连接 符号串连接:α和β都是符号串,则αβ为符号串的连接 特别有: 特别有:λβ = βλ = β 符号串集的乘积:A和B是符号串的集合,则称 符号串集的乘积: 是符号串的集合, AB={αβ α∈A αβ| AB={αβ| α∈A,β ∈B} 特别有: A=A∅=A,其中∅表示空集。 特别有:∅A=A∅=A,其中∅表示空集。
符号串的方幂: 符号串的方幂: 是符号串的集合 则称A 的集合, 设A是符号串的集合,则称Ai为符号 串集A的方幂,其中i是非负整数。 串集A的方幂,其中i是非负整数。 ={λ A0 ={λ} A1 = A , A2 = A A AA......A(k个 AK = AA......A(k个) 符号串集合的正闭包: 符号串集合的正闭包: A+ =A1 ∪ A2 ∪A3 ...... 符号串集合的星闭包: 符号串集合的星闭包: A* =A0 ∪ A1 ∪ A2 ∪A3 ...... A* = A+ ∪ A0 = A+ ∪ {λ}
例:设字母表∑={a-zA-Z} ,串集A={a},串 ∑ {a-zA串集A={a} A={a}, 集B={bcd} 则 A2 ==aa A5=aaaaa B+ == B1 ∪ B2 ∪B3 ...... ==(bcd)1 ∪(bcd)2 ∪(bcd)3...... ==(bcd) (bcdbcd)∪ ==(bcd)∪(bcdbcd)∪bcdbcdbcd ...... AB=abcd
2011-1-5
CS_Dept. GDCC Hjj
6 /29
正则表达式及其一些性质
书上: 书上:
RE
∑为给定的字母表,则每个Σ上的正则表达 为给定的字母表,则每个Σ上的正则表达 式将定义Σ上的一个字符串集 字符串集。 表示∑ 式将定义Σ上的一个字符串集。 用RΣ表示∑ 上的正则表达式 表示R 上的正则表达式,用L(RΣ)表示RΣ所表示的字 符串集合(正则表达式的集合,语言, 符串集合(正则表达式的集合,语言,正规 集) 。 函数L 即:函数L表示
正则表达式 定义 字符串集合RΣ 字符串集合 构成 语言L(RΣ) 语言
正则表达式→字符串集的映射。 正则表达式→字符串集的映射。
的定义及其含义如下: 则RΣ 的定义及其含义如下:
■ ■ ■ ■ 其中L( L(∅ ∅是正则表达式,即∅∈RΣ 。其中L(∅)={ }。 是正则表达式, ∅∈R 是正则表达式, λ∈R 其中L( L(λ λ 是正则表达式 , 即 λ∈ RΣ 。 其中 L(λ)={ λ }。 其中L(c)={c} L(c)={c}。 c∈Σ是正则表达式,即c∈RΣ。其中L(c)={c}。 ∈Σ是正则表达式, 是正则表达式 A和B是正则表达式,即A ∈RΣ,B ∈RΣ ,则有 是正则表达式, ( A ) ∈ R Σ, A | B ∈ R Σ, A B A* ∈ R Σ, ∈ R Σ, L( (A) ) = L(A) L(A)∪ L( A | B ) = L(A)∪L(B) L( A B ) L( A*) = L(A)L(B) = L(A)*
扩充的正则表达式
一次或多次重复: 一次或多次重复: A+ 任何符号: 任何符号:“…”在字母表中任何符号.|.|.|. ”在字母表中任何符号.|.|.|. 符号范围: [0[a [A符号范围: [0-9] [a-z] [A-Z] 不在给定范围内的符号: ~(a|b|c) a|b|c)或 不在给定范围内的符号: ~(a|b|c)或[^ a] 可选: (+| 可有可无,即有和无两种情况) 可选: (+|-)? (可有可无,即有和无两种情况) L( A+) = L(A)+ 例:A+∈RΣ, A?∈ RΣ , L( A ?)= L(A) ∪{λ} ? λ 枚举[abc] ∈ RΣ , L([abc] )_=(a|b|c) 枚举 [0-9a-z]=[0-9]|[a-z]=(0|1|2…9)|[a-z]
2011-1-5 CS_Dept. GDCC Hjj
9 /29
优先级约定
括号的优先级最高 闭包运算有最高的优先级,并且是左结合的运 算; 连接运算的优先级次之,且也是左结合的运算; 或运算的优先级最低,且仍是左结合的运算。 闭包运算( )>连接运算( )>选择运算( ) )>连接运算 )>选择运算 闭包运算(*)>连接运算(·)>选择运算(|) 例: ((a)(b)*)|(c) ab*|c
2011-1-5 CS_Dept. GDCC Hjj
10 /29
正则表达式例
∑={ a,b }. 正则表达式e 正则表达式e 1. ab* L(e) 上所有以a 1. ∑上所有以a为首后跟任意多 包括0 个(包括0个)b的字符串集 上所有以a 2. ∑上所有以a为首的字符串集
2. a(a|b)*
正则表达式的性质
A | B = B | A A | (B | C) =(A | B )| C A (B C) =(A B )C A (B | C) =A B | A C (A | B ) C =A C | B C A** =A* Aλ=λA=A λ=λA=A
(A|B)* (A·B)* A*|B* A*·B*
| 的可交换性 | 的可结合性
连接的可结合性 连接的可分配性 连接的可分配性 幂的等价性 λ是连接的恒等元素
(A|B)* (A*|B*)*
正则表达式的性质
A | B = B | A A | (B | C) =(A | B )| C A (B C) =(A B )C A (B | C) =A B | A C (A | B ) C =A C | B C A** =A* Aλ=λA=A λ=λA=A
(A|B)*≠ A*|B* (A·B)* ≠ A*·B*
2011-1-5 CS_Dept. GDCC Hjj
| 的可交换性 | 的可结合性
连接的可结合性 连接的可分配性 连接的可分配性 幂的等价性 λ是连接的恒等元素
(A|B)* = (A*|B*)*
13 /29
程序设计语言中单词的 正则表达式定义
Begin= 保留字 如 Begin=begin 标识符
letter=[aletter=[a-z,A-Z] digit=[0 digit=[0-9] identifier=letter(letter|digit letter|digit) identifier=letter(letter|digit)*
数字
整数Int=[1整数Int=[1-9]Digit*|0 Int 实数real Int. real= 实数real=Int.Int
+|特殊符号 +|-|…
正则表达式的局限性
正则表达式不能用于描述配对或嵌套的结 正则表达式不能用于描述配对或嵌套的结 不能用于描述配对 构 正则表达式不能用于描述重复串 正则表达式不能用于描述重复串 的串}无法用正则表 例:{w c w | w是a和b的串 无法用正则表 是 和 的串 达式表示(保证两边w是相同的 是相同的)。 达式表示(保证两边 是相同的)。
正则表达式的应用
程序设计语言中的基本元素-单字 程序设计语言中的基本元素 单字(token) 单字 的描述和判读。 的描述和判读。 在涉及文本的应用领域里。 在涉及文本的应用领域里。
2011-1-5
CS_Dept. GDCC Hjj
16 /29
课堂练习1 课堂练习1
正则运算:
设∑={a,b,…,z},A={good,bad},B={boy,girl}, 求:
1) 2) 3)
A|B AB A*
2011-1-5
CS_Dept. GDCC Hjj
17 /29
课堂练习2 课堂练习2
假定字母表∑={0, 1},如何用正则表达式描述 下述语言(字符串集)? 1) ?={w|w中恰好有一个1} 2) ?= {w|w是由任意个0和1组成的字符串} 3) ?={w|w中至少有一个1} 4) ?={w|w含有子串001} 5) ?={w|w的长度是3的整数倍} 6) ?={w|w的开始符号和结束符号相同}
2011-1-5 CS_Dept. GDCC Hjj
18 /29
课堂练习2 课堂练习2
假定字母表∑={0, 1},如何用正则表达式描述 下述语言(字符串集)? 1) ?={w|w中恰好有一个1} 0*10* 2) ?= {w|w是由任意个0和1组成的字符串} (0|1)* ) 3) ?={w|w中至少有一个1} (0|1)*1 (0|1)* ) ) 4) ?={w|w含有子串001} (0|1)*001 (0|1)* ) ) 5) ?={w|w的长度是3的整数倍} ((0|1)(0|1)(0|1))* 6) ?={w|w的开始符号和结束符号相同} 0 (0|1)*0|1 (0|1)*1 ) )
2011-1-5 CS_Dept. GDCC Hjj
19 /29
正则定义
正则表达式的优点是:便于描述符号串 的集合,而且它是结构化的描述工具。 然而有时书写出来式子比较复杂(较长) 正则定义是一组正则表达式的集合 为较长的正则表达式提供一个简化了的 名字。 名字。
2011-1-5
CS_Dept. GDCC Hjj
20 /29
正则定义
如要为一个或多个数字序列写一个正则表 达式,则可写作: 达式,则可写作: 0|1|2|…|9)(0|1|2| |9)(0|1|2|…9) (0|1|2|…|9)(0|1|2|…9)* 或写作 digit digit* 其中 digit= 0|1|2| |9就是名字 0|1|2|…|9 |9就是名字 digit的正则定义,表示为: 的正则定义,表示为: 0|1|2|…|9 digit 0|1|2| |9
正则定义
如要为一个或多个数字序列写一个正则表 达式,则可写作: 达式,则可写作: 0|1|2|…|9)(0|1|2| |9)(0|1|2|…9) (0|1|2|…|9)(0|1|2|…9)* 或写作 digit digit* 其中 digit= 0|1|2| |9就是名字 0|1|2|…|9 |9就是名字 digit的正则定义,表示为: 的正则定义,表示为: 0|1|2|…|9 digit 0|1|2| |9
2011-1-5
正则名
宏正则表达式。其中只允许出现已定义的正 则名,而不允许包含未定义的正则名 22 /29 CS_Dept. GDCC Hjj
正则定义
例:M1 e1; M 2 e 2; M 3 e 3; M (M1M2|M3)* A 0 表示符号串 0∈A 或 A生成 符号串 生成 符号串0 读作“生成” 读作“生成” 或 “由….组成” .组成”
CS_Dept. GDCC Hjj
2011-1-5
23 /29
正则表达式的缩写形式
一个或多个实例 一元后缀算符“+”,表示“一个或多个实 例” 例:a+表示一个或多个a的所有串的集合。 r*=r +|λ r +=r r* 零个或一个实例 一元后缀算符“?” 表示“零个或一个实 例” 例: (r)? 表示 L(r) ∪|λ| | 2011-1-5 字符组 24 /29 CS_Dept. GDCC Hjj
相关文档
最新文档