常用表达 :
- 它是一种表示常规语言的方式。
- 正则语言的代数描述是使用正则表达式完成的。
- 它们可以定义各种形式的有限自动机可以描述的相同语言。
- 正则表达式提供了有限自动机所没有的东西,即它是一种表达我们想要接受的字符串的声明方式。它们充当许多系统的输入。它们用于许多系统( Java、 Python等)中的字符串匹配
- 例如,词法分析器生成器,例如 Lex 或 Flex。
正则表达式中广泛使用的运算符是 Kleeneclosure(*)、concatenation(.)、Union(+)。
正则表达式规则:
- 正则表达式集由以下规则定义。
- ∑的每一个字母都可以做成一个正则表达式,空字符串,∈本身就是一个正则表达式。
如果r1和r2是正则表达式,那么(r1)、r1.r2、r1+r2、r1*、r1 +也是正则表达式。
示例 – ∑ = {a, b} 和 r 是使用这些符号的语言的正则表达式
Regular language | Regular set |
---|---|
∅ | { } |
∈ | {∈} |
a* | {∈, a, aa, aaa …..} |
a+ b | {a, b} |
a.b | {ab} |
a* + ba | {∈, a, aa, aaa,…… , ba} |
对正则表达式执行的操作:
1. 联盟——
用 L1 ∪ L2 表示的两种正则语言 L1 和 L2 的并集也是正则的,表示位于 L1 或 L2 或两者中的字符串集。
例子
L1 = (1+0).(1+0) = {00 , 10, 11, 01} 和
L2 = {∈ , 100}
则 L1 ∪ L2 = {∈, 00, 10, 11, 01, 100}。
2. 串联 –
两个正则语言L1和L2,它们使用L1.L2为代表的级联也定期和表示由取入L1与L2中任何字符串串联它的任何字符串形成的组字符串。
例子 –
L1 = { 0,1 } 和 L2 = { 00, 11} 然后 L1.L2 = {000, 011, 100, 111}。
3. Kleene 闭合–
如果 L1 是正则语言,那么 L1 的 Kleene 闭包即 L1* 也是正则的,表示从 L1 中取出多个字符串形成的那些字符串的集合,并且同一字符串可以重复任意次数并连接那些字符串。
例子 –
L1 = { 0,1} = {∈, 0, 1, 00, 01, 10, 11 …….} ,那么 L* 是所有可能的字符串,符号 0 和 1 包括空字符串。
正则表达式的代数性质:
Kleene 闭包是一元运算运算符,Union(+) 和连接运算符(.) 是二元运算符。
1. 关闭 –
如果 r1 和 r2 是正则表达式(RE),则
- r1* 是一个 RE
- r1+r2 是一个 RE
- r1.r2 是一个 RE
2. 关闭法 –
- (r*)* = r,关闭已经关闭的表达式不会改变语言。
- ∅* =∈,通过连接任何数量的空字符串的拷贝形成的字符串是空的本身。
- r + = rr* = r*r,因为 r* = ∈ + r + rr+ rrr ….并且 rr* = r+ rr + rrr ……
- r* = r*+ ∈
3. 关联性——
如果 r1、r2、r3 是 RE,则
i.) r1+ (r2+r3) = (r1+r2) +r3
- 例如: r1 = a , r2 = b , r3 = c, 然后
- LHS 中的结果正则表达式变为 a+(b+ c),对应 RE 的正则集为 {a, b, c}。
- 因为 RHS 中的 RE 变成 (a+ b) + c 并且这个 RE 的正则集是 {a, b, c},这在两种情况下都是相同的。因此,结合性属性适用于联合运算符。
ii.) r1.(r2.r3) = (r1.r2).r3
- 例如 – r1 = a , r2 = b , r3 = c
- 那么 RE a.(bc) 接受的字符串就只有 abc。
- RHS 中 RE 接受的字符串是 (ab).c 只是 abc ,这在两种情况下都是相同的。因此,关联性适用于连接运算符。
结合性属性不适用于 Kleene 闭包(*),因为它是一元运算运算符。
4. 身份——
在联合运算符的情况下
如果 r+ x = r ⇒ x= ∅ 作为 r ∪ ∅= r,则 ∅ 是 + 的恒等式。
因此,∅ 是联合运算符的单位元素。
在连接运算符的情况下 –
如果 rx = r ,对于 x= ∈
r.∈ = r ⇒ ∈ 是连接运算符(.) 的单位元素。
5. 歼灭者——
- 如果 r+ x = r ⇒ r ∪ x= x ,则 + 没有湮灭子
- 在串联运算符的情况下,rx = x,当 x = ∅ 时,则 r.∅ = ∅,因此 ∅ 是 (.)运算符的湮灭符。例如 {a, aa, ab}.{ } = { }
6. 交换性质——
如果 r1, r2 是 RE,则
- r1+r2 = r2+r1。例如,对于 r1 =a 和 r2 =b,则 RE a+ b 和 b+ a 相等。
- r1.r2≠r2.r1。例如,对于 r1 = a 和 r2 = b,则 RE ab 不等于 ba
7. 分布式财产——
如果 r1, r2, r3是正则表达式,则
- (r1+r2).r3 = r1.r3 + r2.r3 即右分布
- r1.(r2+ r3) = r1.r2 + r1.r3 即左分布
- (r1.r2) +r3 ≠ (r1+r3)(r2+r3)
8. 幂等律——
- r1 + r1 = r1 ⇒ r1 ∪ r1 = r1 ,因此联合运算符满足幂等性。
- rr ≠ r ⇒ 连接运算符不满足幂等性。
9. 正则表达式的身份 –
正则表达式有很多标识。设 p、q 和 r 是正则表达式。
- ∅ + r = r
- ∅.r= r.∅ = ∅
- ∈.r = r.∈ =r
- ∈* = ∈ 和 ∅* = ∈
- r + r = r
- r*.r* = r*
- rr* = r*.r = r + .
- (r*)* = r*
- ∈ +rr* = r* = ∈ + rr*
- (pq)*.p = p.(qp)*
- (p + q)* = (p*.q*)* = (p* + q*)*
- (p+ q).r= p.r+ qr 和 r.(p+q) = rp + rq