正则表达式概念
基本概念及操作
基本概念
一个正则表达式描述了一个定义在某个字母表 Σ \Sigma Σ上的字符串的集合+一个描述空串的 ϵ \epsilon ϵ。字符串的这种集合称为一种语言。
基本操作
- 选择:两个字符串集合 R R R和 S S S的并集,记 R ∣ S R|S R∣S, { x ∣ x ∈ R 或 x ∈ S } \{x|x \in R 或 x \in S\} {x∣x∈R或x∈S}
- 连接:记 R S RS RS,包含前面集合的任一元素后接上后面集合的任一元素形成的所有字符串, { x y ∣ x ∈ R 且 y ∈ S } \{xy|x \in R 且 y \in S \} {xy∣x∈R且y∈S}
- 闭包:集合 R R R的柯林闭包,集合与自身连接零或多次形成的集合取并集,记作 R ∗ R^* R∗,定义为 ⋃ i = 0 ∞ R i \bigcup_{i = 0}^\infty R^i ⋃i=0∞Ri
归纳定义
对给定的字符集
Σ
=
{
c
1
,
c
2
,
…
,
c
n
}
\Sigma = \{c1,c2,\dots,cn\}
Σ={c1,c2,…,cn}
归纳定义:
- 空串 ϵ \epsilon ϵ是正则表达式,表示仅含空串的集合,该语言只含空串。
- 对于任意 c ∈ Σ c \in \Sigma c∈Σ, c c c是正则表达式,表示尽包含 c c c的集合,仅串 c c c
- 如果
M
M
M和
N
N
N是正则表达式,则以下也是正则表达式
- 选择: M ∣ N = { M , N } M|N = \{M,N\} M∣N={M,N}
- 连接: M N = { m n ∣ m ∈ M , n ∈ N } MN = \{mn|m \in M, n \in N\} MN={mn∣m∈M,n∈N}
- 闭包: M ∗ = { ϵ , M , M M , M M M , … } M^* = \{\epsilon,M,MM,MMM,\dots\} M∗={ϵ,M,MM,MMM,…}
- 优先级:括号、闭包、连接、选择、左结合
正则表达式的代数定律
相等定义
如果两个正则表达式 r r r和 s s s表示相同的语言
- 称为 r r r和 s s s等价
- 如: a ∣ b = b ∣ a a|b = b|a a∣b=b∣a
代数定律
- r ∣ s = s ∣ r r|s = s|r r∣s=s∣r
- r ∣ ( s ∣ t ) = ( r ∣ s ) ∣ t r|(s|t) = (r|s)|t r∣(s∣t)=(r∣s)∣t
- r ( s t ) = ( r s ) t r(st) = (rs)t r(st)=(rs)t
- r ( s ∣ t ) = r s ∣ r t , ( s ∣ t ) r = s r ∣ t r r(s|t) = rs|rt,(s|t)r = sr|tr r(s∣t)=rs∣rt,(s∣t)r=sr∣tr
- ϵ r = r ϵ = r \epsilon r = r\epsilon = r ϵr=rϵ=r
- r ∗ = ( r ∣ ϵ ) ∗ r^* = (r|\epsilon)^* r∗=(r∣ϵ)∗
- r ∗ ∗ = r ∗ r^{**} = r^* r∗∗=r∗
正则表达式的拓展
多种针对RE的拓展,以增强RE描述字符串的能力
- +:一个或多个实例,e+ == 一个或多个e
- ?:零个或一个实例,e? == 零个或一个e
- 字符类
- [abc] == a|b|c
- 连接:第一个和最后一个符号,中间连词符:[a-c] == a|b|c
- 转义
- 如:使用\*表示*