编译原理--正则表达式

本文深入探讨了正则表达式的概念,通过实例解释了如何将正则语言用正则表达式紧凑表示。内容包括正则表达式的定义、构造规则以及与正则文法之间的等价性,阐述了正则表达式在描述和处理字符串模式中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


语言 L = { a } { a , b } ∗ ( { ϵ } ∪ ( { . , _ } { a , b } { a , b } ∗ ) ) L=\{a\}\{a,b\}^*(\{\epsilon \} \cup (\{.,\_\}\{a,b\}\{a,b\}^*)) L={a}{a,b}({ϵ}({.,_}{a,b}{a,b}))

这个语言是指,由a开头,后接任意长度的a、b串,然后再接空串(代表结束)。或者是接以._开头的,后接长度大于等于1a、b串。

正则表达式(Regular Expression, RE)是一种用来描述正则语言的更紧凑的表示方法。

以上面的语言举例,写成正则表达式则可表示成: r = a ( a ∣ b ) ∗ ( ϵ ∣ ( . ∣ ) ( a ∣ b ) ( a ∣ b ) ∗ ) r=a(a|b)^*(\epsilon | (.|_)(a|b)(a|b)^*) r=a(ab)(ϵ(.)(ab)(ab))

正则表达式可以由较小的正则表达式按照特定规则递归地构建。每个正则表达式r定义一个语言。记为L(r)。这个语言也是根据r的子表达式所表示的语言递归定义的。

定义

  • 如果 ϵ \epsilon ϵ是一个RE, L ( ϵ ) = { ϵ } L(\epsilon) = \{\epsilon\} L(ϵ)={ϵ}
  • 如果 α ∈ ∑ \alpha \in \sum α,则 α \alpha α是一个RE, L ( α ) = { α } L(\alpha)=\{\alpha\} L(α)={α}
  • 假设rs都是RE,表示的语言分别是L(r)L(s),则
    • r ∣ s r|s rs是一个RE, L ( r ∣ s ) = L ( r ) ∪ L ( s ) L(r|s) = L(r) \cup L(s) L(rs)=L(r)L(s)
    • rs(r连接s)是一个RE, L ( r ∣ s ) = L ( r ) L ( s ) L(r|s) = L(r)L(s) L(rs)=L(r)L(s)
    • r ∗ r^* r是一个RE, L ( r ∗ ) = ( L ( r ) ) ∗ L(r^*) = (L(r))^* L(r)=(L(r))
    • ( r ) (r) (r)是一个RE, L ( ( r ) ) = L ( r ) L((r)) = L(r) L((r))=L(r)

注:运算的优先级:*、连接、|

例: ∑ = { a , b } \sum = \{a,b\} ={a,b},则

  • L ( a ∣ b ) = L ( a ) ∪ L ( b ) = { a } ∪ { b } = { a , b } L(a|b) = L(a) \cup L(b) = \{a\} \cup \{b\} = \{a,b\} L(ab)=L(a)L(b)={a}{b}={a,b}
  • L ( ( a ∣ b ) ( a ∣ b ) ) = L ( a ∣ b ) L ( a ∣ b ) = { a , b } { a , b } = { a a , a b , b a , b b } L((a|b)(a|b)) = L(a|b)L(a|b) = \{a,b\}\{a,b\} = \{aa,ab,ba,bb\} L((ab)(ab))=L(ab)L(ab)={a,b}{a,b}={aa,ab,ba,bb}
  • L ( a ∗ ) = ( L ( a ) ) ∗ = { a } ∗ = { ϵ , a , a a , a a a , . . . } L(a^*) = (L(a))^* = \{a\}^* = \{\epsilon,a,aa,aaa,...\} L(a)=(L(a))={a}={ϵ,a,aa,aaa,...}
  • L ( ( a ∣ b ) ∗ ) = ( L ( a ∣ b ) ) ∗ = a , b ∗ = { ϵ , a , b , a a , a b , b a , b b , . . . } L((a|b)^*) = (L(a|b))^* = {a,b}^* = \{\epsilon,a,b,aa,ab,ba,bb,...\} L((ab))=(L(ab))=a,b={ϵ,a,b,aa,ab,ba,bb,...}
  • L ( a ∣ a ∗ b ) = L ( a ) ∪ L ( a ∗ b ) = L ( a ) ∪ L ( a ∗ ) L ( b ) = { a , b , a b , a a b , a a a b , . . . } L(a|a^*b) = L(a) \cup L(a^*b) = L(a) \cup L(a^*)L(b) = \{a,b,ab,aab,aaab,...\} L(aab)=L(a)L(ab)=L(a)L(a)L(b)={a,b,ab,aab,aaab,...}

注:可以用RE定义的语言叫做正则语言(regular language)或正则集合(regular set)。

RE的代数定理

定律描述
r | s = s | r| 是可以交换的
r | (s | t) = (r | s) | t| 是可以结合的
r ( s t ) = ( r s ) t连接是可以结合的
r (s | t) = rs | rt连接对 | 是可分配的
ϵ r = r ϵ = r \epsilon r = r \epsilon = r ϵr=rϵ=r ϵ \epsilon ϵ是连接的单位元
$r^* = (r\epsilon)^*$
r ∗ ∗ = r ∗ r^{**} = r^* r=r*具有幂等性

正则文法与正则表达式等价

  • 对任何正则文法G,存在定义同一语言的正则表达式r
  • 对任何正则表达式r,存在生成同一语言的正则文法G
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值