📜  正则表达式的属性

📅  最后修改于: 2021-09-27 06:22:24             🧑  作者: Mango

常用表达 :

  • 它是一种表示常规语言的方式。
  • 正则语言的代数描述是使用正则表达式完成的。
  • 它们可以定义各种形式的有限自动机可以描述的相同语言。
  • 正则表达式提供了有限自动机所没有的东西,即它是一种表达我们想要接受的字符串的声明方式。它们充当许多系统的输入。它们用于许多系统( 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