564 字
3 分钟
[形式语言与自动机] 正则语言与正则表达式

正则语言的定义#

正则语言是在有限字母表 Σ\Sigma 上的一个集合,其中包含的元素是所有能被一个正则表达式/DFA/NFA识别的字符串,正则语言是Σ\Sigma^*的一个子集

正则表达式的定义#

正则表达式是一个字符串,使用特定的语法规则来描述一个正则语言。正则表达式和DFA、NFA之间是等价的,即它们识别的正则语言是相同的

正则表达式DFANFA\text{正则表达式} \Leftrightarrow \text{DFA} \Leftrightarrow \text{NFA}

正则表达式由以下基本元素组成,且以下每个元素本身也是一个正则表达式:

  • 空集:表示一个不包含任何字符串的语言,通常用符号 \emptyset 表示
  • 空字符串:表示一个只包含空字符串的语言,通常用符号 ϵ\epsilon 表示
  • 单个符号:对于每个输入符号 aΣa \in \Sigma,表示一个只包含字符串 aa 的语言
  • 连接:如果 RRSS 是正则表达式,那么 RSRS 表示连接操作,表示由 RR 中的字符串连接 SS 中的字符串组成的语言,或多次连接,例如 RnR^n 表示由 RR 中的字符串连接 nn 次组成的语言,R0={ϵ}R^0=\{\epsilon\}
  • 选择:如果 RRSS 是正则表达式,那么 RSR|S 表示选择操作,表示由 RR 中的字符串或 SS 中的字符串组成的语言
  • 闭包:如果 RR 是一个正则表达式,那么 RR^* 表示闭包操作,表示由 RR 中的字符串重复零次或多次组成的语言

一个正则表达式通过有限次上述操作后生成的仍然是一个正则表达式,因此正则表达式可以递归定义

TIP

正闭包:R+R^+ 表示由 RR 中的字符串重复一次或多次组成的语言,即 R+=RRR^+ = RR^*

克林闭包:RR^* 表示由 RR 中的字符串重复零次或多次组成的语言,即 R={ϵ}R+R^* = \{\epsilon\} \cup R^+

运算顺序:括号 > 闭包 > 连接 > 选择

例子#

设计一个正则表达式匹配所有包含110但不能包含111的二进制字符串

可以使用以下正则表达式:

(010)110(01001)(0∣10)^∗110(0∣10∣01)^∗
[形式语言与自动机] 正则语言与正则表达式
https://a1kari8.github.io/posts/automata/regex/
作者
A1kari8
发布于
2026-05-30
许可协议
CC BY-NC-SA 4.0