正則表達式
1 基本概念
1.1 正則
正則表達式是語法,正則語言是語義
def(正則表達式):
給定字母表 Σ, Σ 上的正則表達式由且僅由以下規則定義:
-
ϵ 是正則表達式;
-
∀a ∈ Σ, a 是正則表達式;
-
如果 r 是正則表達式, 則 (r) 是正則表達式;
-
如果 r 與 s 是正則表達式, 則 r|s, rs, r∗ 也是正則表達式。
運算優先級: () ≻ ∗ ≻ 連接 ≻ |
def(正則表達式對應的語言):
L(ϵ) = {ϵ}
L(a) = {a}, ∀a ∈ Σ
L((r)) = L(r)
- L(r|s) = L(r)∪L(s)
- L(rs) = L(r)L(s)
- L(r∗) = (L(r))∗
1.2 自動機
兩大要素:
- 狀態集S
- 狀態轉移函數δ
1.3 NFA
Nondeteministic Finite Automaton,非確定自動狀態機
A 是一個五元組 A = (Σ, S, s0, δ, F):
-
字母表 Σ (ϵ !∈ Σ)
-
有窮的狀態集合 S
-
唯一的初始狀態 s0 ∈ S
-
狀態轉移函數 δ
δ : S × (Σ ∪ {ϵ}) → 2S
-
接受狀態集合 F ⊆ S
A 定義了一種語言 L(A): 它能接受的所有字符串構成的集合
約定:所有沒有對應出邊的字符默認指向一個不存在的 “空狀態” ∅
關於自動機的兩個問題:
- 給定字符串x,x是否屬於L(A)
- L(A)究竟是什么
![]()
1.4 DFA
Deterministic Finite Automaton,確定性有窮自動機
A 是一個五元組 A = (Σ, S, s0, δ, F):
-
字母表 Σ (ϵ !∈ Σ)
-
有窮的狀態集合 S
-
唯一的初始狀態 s0 ∈ S
-
狀態轉移函數 δ
δ : S × Σ → S
-
接受狀態集合 F ⊆ S
約定: 所有沒有對應出邊的字符默認指向一個不存在的 “死狀態”
NFA vs DFA
- 對於字母表中的每個符號,DFA中的每個狀態都有且只有一條關於這個符號的出邊(exiting transition)。NFA則未必,在同一個狀態上可能有零條、一條甚至多條關於某一個符號的出邊。
- DFA的轉換箭頭上的標簽必須是字母表中的,但NFA可以有標識為ϵ的邊,NFA的狀態可能有零條、一條甚至多條ϵ邊。
1.5 下文將介紹的
2 RE到NFA:Tompson構造法
2.1 從正則表達式的定義出發
回顧一下正則表達式的遞歸定義:def(正則表達式):
給定字母表 Σ, Σ 上的正則表達式由且僅由以下規則定義:
- ϵ 是正則表達式;
- ∀a ∈ Σ, a 是正則表達式;
- 如果 r 是正則表達式, 則 (r) 是正則表達式;
- 如果 r 與 s 是正則表達式, 則 r|s, rs, r∗ 也是正則表達式。
2.2 Tompson構造法
Tompson構造法就是從這四條規則出發,定義了四個基本狀態
-
ϵ 是正則表達式
-
a ∈ Σ 是正則表達式
-
如果 s 是正則表達式, 則 (s) 是正則表達式
沒什么好說的
-
如果 s, t 是正則表達式, 則 s|t 是正則表達式
-
如果 s, t 是正則表達式, 則 st 是正則表達式
-
如果 r, s 是正則表達式, 則r∗ 也是正則表達式
2.3 例題一則
3 NFA到DFA:子集構造法
思想:用DFA模擬NFA
3.1 子集構造法
構造出的DFA,只要包含的NFA狀態中有NFA接受狀態,則該DFA狀態為DFA接受狀態
3.2 例子一則
NFA如2.3
4 DFA最小化
DFA最小化算法的基本思想:等價的狀態可以合並
4.1 如何定義等價狀態
最小化的直接想法就是,如果狀態等價,就將其合並
問題在於:如何定義等價狀態?
-
嘗試1:
這個定義是錯誤的,有時過於緊,有時過於松,反例如下:
A ∼ C ∼ E 但是, 接受狀態與非接受狀態必定不等價
-
嘗試2:
√
4.2 從何下手

這個定義是遞歸的,該從何下手?
——反其道而行之,划分,而非合並!
4.3 流程
4.4 例子一則
紙上得來終覺淺,絕知此事要躬行,我們直接從一個例子入手:
注:這里的操作順序不唯一
因為接受狀態和非接受狀態必定不等價,定義Π0 = {F, S \ F}

因此,合並AC
5 DFA到RE:Kleene構造法
- 字符串 x 對應於有向圖中的路徑
- 求有向圖中所有 (從初始狀態到接受狀態的) 路徑
- 但是, 如果有向圖中含有環, 則存在無窮多條路徑
- 不要怕, 我們有 Kleene 閉包
5.1 思想
思想上類似於floyed-warshell算法

Q的初始化:

∅ (注意: 它不是正則表達式) 的規定
- ∅r = r∅ = ∅
- ∅|r = r
5.2 算法

5.3 例子一則
-
init
-
step0
-
step1
-
step2