简介
正则表达式(Regular Expression)简称 RE,它是一种用来表示有限自动机所接受单词组合的语言,相对于有限自动机会更加的直观易读。
符号表示
设定:
一个 RE 描述和定义了某个字母表 Σ 上字符串的集合,以及一个表示空字符串字符 ϵ
RE 的三个基本操作:
- 可选(alternative):对于给定的两个正则表达式 M 和 N,选择操作符( | )形成一个新的正则表达式 M|N ,如果一个字符串属于 M 或者 N,则它属于 M|N。
- 联结(concatenation):对于两个对于给定了两个正则表达式 M 和 N,连接操作符( · )形成一个新的正则表达式 M·N,通常可以省略连接符号,比如 (a|b)·a ,定义了两个字符串:aa、ab。
- 克林闭包(Kleene closure): 正则表达式 M 的克林闭包,记作 M*,定义为 M 与自身连接 0 次或者多次形成的所有集合取并集。
在以上三个基本操作的基础上,可以如下定义字母表 Σ 和空字符串 ϵ的集合
- 符号(symbol):对于字母表中任一个字符 a 都可以表示为一个正则表达式 M,M 表示仅包含字符串 a 的集合
- 如果 r 和 s 是 RE,分别表示集合 R 和 S,那么 r|s 也是 RE,它表示 R 和 S 两个集合的并集,r · s 也是一个 RE,表示 R 和 S 的联结,r* 也是一个 RE,表示 R 的克林闭包
- 空白字符串(ϵ):表示仅含一个空字符串,也可以进行以上基础操作
使用
1. 优先级
在书写正则表达式时,有时候会省略联结操作符 · 或者 ϵ 符号,并假定克林闭包的优先级高于联结操作符 · ,联结操作符 · 优先级优先于可选操作符 | 。
2. 消除二义性规则
- 最长匹配:初始输入子串种,取可与任何 RE 匹配的那个最长字符串作为下一个单词
- 规则优先:对于一个特定的最长初始字符串,第一个与之匹配的 RE 决定了这个子串的单词类型,即 RE 的书写顺序有意义
3. 简洁缩写
为了方便书写,目前主流语言在基础符号表示的基础上进行了多样化的扩充,但是它们并没有扩充正则表达式的描述能力,意思就是:任何可以用简写形式面熟的字符串集合都可以用基本操作符集合来描述,下面针对 C 语音举几个例子
通配符:
- 通配符: * ,由于很少有键盘打出 Σ,所以大多数其他系统也通常用 * 来替代 Σ*
- 单个字符通配符: ?
- 换行符之外的任意单个字符:用 . 来表示
范围
数量表示:
- M{n} :表示 M 可以出现 n 次
- M{n,m} :表示 M 出现最少n次最多m次
- M{n,} : 表示 M 出现 n 次以及以上
- M+:重复一次或者以上,MM* 的简写
- M?:出现 0 或者 1 次, ϵ | M 的简写
还有一些其他预定义的简写形式,比如:
- \d :表示任意一个数字,等同于 [0-9]
- \D :表示不是数字
- \w :表示任意一个单词字符,等同于 [a-zA-Z0-9_]
- \W :不是单词字符
- \s :表示任意一个空白字符
- \S :不是空白字符