在本章中, 我们将概述语言和正则表达式的相关定义, 性质与其他内容.
我们首先引入一系列基本概念:
定义 1.1.1 符号
符号是组成字符串的最小单位, 不可被继续分割, 在形式逻辑中亦被称为字母 (
letter
), 常使用 x , y , z , ⋯ x, y, z, \cdots x,y,z,⋯ 表示.
定义 1.1.2 字母表
字母表是由符号组成的集合, 指代任意字母表的符号是 Σ \Sigma Σ.
定义 1.1.3 字符串
字符串由 0 0 0 或更多的符号组成, 在形式逻辑中亦被称为文字 (
word
), 使用 s , t , u , ⋯ s, t, u, \cdots s,t,u,⋯ 表示.
定义 1.1.4 空文字
空文字是不包含任何符号的字符串, 其长为 0 0 0, 使用 ϵ \epsilon ϵ 表示.
定义 1.1.5 连接
连接是将两个字符串头尾相接组成新字符串的操作.
我们使用 幂 简化重复的连接, 如:
( 010 ) 3 = 010010010. (010)^3 = 010010010. (010)3=010010010.
定义 1.1.6 语言
语言是由文字组成的集合, 使用 L 1 , L 2 , ⋯ \mathscr{L}_1, \mathscr{L}_2, \cdots L1,L2,⋯ 表示.
在上述的定义中, 我们将语言及其组成描述为集合或是集合中的元素, 通过引入对集合的各种操作 (也就是运用“模式”), 我们可以在给定语言的基础上生成新的语言. 可行的操作如下:
并:
可以将两个不同的语言作并运算得到新的语言.
交:
可以将两个不同的语言作交运算得到新的语言.
相对补 (Set Difference
):
将两个不同的语言作相对补运算, 得到仅包含由某一种语言所独有的文字所组成的新语言.
绝对补 (Set Complement
):
将两个不同的语言作绝对补运算, 得到新的语言.
连接 (Concatenation
):
取任意两个基于字母表 Σ \Sigma Σ 的语言 L 1 , L 2 \mathscr{L_1}, \mathscr{L_2} L1,L2, 有:
L 1 ⋅ L 2 { s ⋅ t ∣ s ∈ L 1 , t ∈ L 2 } . \mathscr{L_1} \cdot \mathscr{L_2} \{s \cdot t \vert s \in \mathscr{L_1}, t \in \mathscr{L_2}\}. L1⋅L2{ s⋅t∣s∈L1,t∈L2}.
任意 n n n 次连接 (n-ary Concatenation
):
L n = { s 1 ⋅ s 2 ⋯ s n ∣ ∀ s i ∈ L , 1 ⩽ i ⩽ n } and L 0 = { s 1 ⋅ s 2 ⋯ s n ∣ ∀ s i ∈ L , 1 ⩽ i ⩽ n } . \begin{aligned} \mathscr{L^n} &= \{s_1\cdot s_2 \cdots s_n ~\vert~ \forall s_i \in \mathscr{L} , 1 \leqslant i \leqslant n\}\\ \text{and}\\ \mathscr{L^0} &= \{s_1\cdot s_2 \cdots s_n ~\vert~ \forall s_i \in \mathscr{L} , 1 \leqslant i \leqslant n\}.\\ \end{aligned} LnandL0={ s1⋅s2⋯sn ∣ ∀si∈L,1⩽i⩽n}={ s1⋅s2⋯sn ∣ ∀si∈L,1⩽i⩽n}.
克莱尼星号 (Kleene Star
):
L ∗ = { s 1 s 2 ⋯ s n ∣ n ∈ N , s 1 , s 2 , ⋯ , s n ∈ L } = ⋃ n ∈ N L n and ∅ ∗ = ⋃ n ∈ N ∅ n = { ϵ } = L 0 for all L . \begin{aligned} \mathscr{L^*} &= \{s_1s_2\cdots s_n ~\vert~ n \in \mathbb{N}, s_1, s_2, \cdots, s_n \in \mathscr{L}\} \\ &= \bigcup_{n \in \mathbb{N}} \mathscr{L^n}\\ \text{and}\\ \emptyset^* &= \bigcup_{n \in \mathbb{N}} \emptyset^n = \{\epsilon\} = \mathscr{L^0} ~~\text{for all} ~~ \mathscr{L}.\\ \end{aligned} L∗and∅∗={ s1s2⋯sn ∣ n∈N,s1,s2,⋯,sn∈L}=n∈N⋃Ln=n∈N⋃∅n={ ϵ}=L0 for all L.
Pattern
) 描述语言我们可以使用在上一节中所定义的模式对语言进行描述:
一般地, 我们使用
|
表示并, 使用*
表示克莱尼星号, 使用括号限定相关符号的作用域. 我们可以使用这种方法表示一部分语言. 而为了表示更多的语言, 我们引入了 正则表达式.
正则表达式是对字符串进行操作的逻辑公式. 它是对指定语言中的所有文字基于特定规则过滤的逻辑.一般地, 正则表达式的定义如下:
定义1.3.1 正则表达式 (Pattern, Regular Expression
)
设字母表 Σ \Sigma Σ. 正则表达式 或 模式 是基于字母表
Σ pat = Σ ∪ { ∅ , ϵ , ∣ , ∗ , ( , ) } \Sigma^{\text{pat}} = \Sigma \cup \{\emptyset, \epsilon, \vert, *, (, )\} Σpat=Σ∪{ ∅,ϵ,∣,∗,(,)}
中的, 任何由下列的一个或多个递归定义所生成的文字:
- Σ \Sigma Σ 中的任一个字母
- 空集 (空模式) ∅ \emptyset ∅ 或 空文字 ϵ \epsilon ϵ
- 某两个正则表达式的并 (
Union
)- 某两个正则表达式的连接 (
Concatenation
)- 在某个正则表达式上所施加的克莱尼星号
在正则表达式中, ( ( ( 和 ) ) ) 用于限定克莱尼星号, 连接算符和取并算符的作用域.
除了精确地表述某种语言的生成规则外, 正则表达式同样用于模式的识别和文字的提取:
定义1.3.2 正则表达式的匹配 (matching
)
设 p p p 为基于字母表 Σ \Sigma Σ 的一种模式 (亦即正则表达式), s s s 为基于 Σ \Sigma Σ 的一个文字. 我们称 s s s 与 p p p 匹配, 若下列条件中至少有一种满足:
- 该模式为 ϵ \epsilon ϵ, 并且 s s s 就是空字符 ϵ \epsilon ϵ.
- 该模式为 x , x ∈ Σ x, ~~ x \in \Sigma x, x∈Σ 且 s = x s = x s=x.
- 该模式为 ( p 1 p 2 ) (p_1p_2) (p1p2), 且 ∃ s 1 , s 2 \exists s_1, s_2 ∃s1,s2 分别和两个模式 p 1 , p 2 p_1, p_2 p1,p2 匹配, s = s 1 s 2 s = s_1s_2 s=s1s2.
- 该模式为 ( p 1 ∣ p 2 ) (p_1 \vert p_2) (p1∣p2), 且 s s s 匹配 p 1 p_1 p1 或 p 2 p_2 p2.
- 该模式形为 ( q ⋆ ) (q^{\star}) (q⋆), 并且 s s s 可被表示为和模式 ( q ⋆ ) (q^{\star}) (q⋆) 匹配的文字 s 1 s 2 ⋯ s n s_1s_2\cdots s_n s1s2⋯sn.
需要注意的是, 根据定义 ∅ \emptyset ∅ 不与任何文字匹配.
此外, 正则表达式同样可以用于对某种语言的描述:
定义1.3.3 由正则表达式描述的语言
记 p p p 为定义在字母表 Σ \Sigma Σ 上的正则表达式. 由正则表达式 p p p 所描述的语言 记为 L ( p ) \mathscr{L}(p) L(p), 即:
L ( p ) = { s ∈ Σ ⋆ ∣ s 与 p 匹配 } . \mathscr{L}(p) = \{s \in \Sigma^\star \vert \text{s 与 p 匹配}\}. L(p)={ s∈Σ⋆∣s 与 p 匹配}.
注:
定义1.3.4 正则语言
我们称语言 L \mathscr{L} L 为 正则的, 若存在一个正则表达式 p p p, 使得该语言为基于其字母表上的, 由全部满足 p p p 的文字所组成的集合. 也即是:
∃ p , s . t . L = L ( p ) . \exists p, ~~ s.t. ~~ \mathscr{L} = \mathscr{L(p)}. ∃p, s.t. L=L(p).
命题1.3.1
若 L 1 , L 2 \mathscr{L_1}, \mathscr{L_2} L1,L2 均为基于某个字母表 Σ \Sigma Σ 上的正则语言, 则下列语言也是正则语言:
- L 1 ∪ L 2 \mathscr{L_1} \cup \mathscr{L_2} L1∪L2
- L 1 ⋅ L 2 \mathscr{L_1} \cdot \mathscr{L_2} L1⋅L2
- L 1 ∗ \mathscr{L_1^{*}} L1∗
- L 1 n \mathscr{L_1^{n}} L1n
在本章中, 我们介绍了文字, 字母, 语言等概念, 以集合的思想对语言进行了表述并引入了基于已有语言生成新语言的方法. 此外, 我们还对正则表达式, 以及使用正则表达式过滤文字, 使用正则表达式描述语言等概念进行了数学意义上的严格解释. 在下一章中, 我们将介绍不同种类的自动机 (Automata
), 并介绍多个实现在自动机和模式 (正则表达式) 之间进行转换的算法.