3.2.1 什么是正则表达式
正则表达式是一种表示方式,让你可以查找匹配特定准则的文本,例如,“以字母 a 开头”。此表示法让你可以写一个表达式,选定或匹配多个数据字符串。
很多的UNIX工具程序沿用某一种正则表达式形式来强化本身的功能。这里列举一部分例子:
- 用来寻找匹配文本行的 grep 工具族:grep 与 egrep ,以及非标准但很好用的 agrep 工具。
- 用来改变输入流的 sed 流编辑器( stream editor ),本章稍后将会介绍。
- 字符串处理程序语言,例如 awk、Icon、Perl、Python、Ruby、Tcl等。
- 文件查看程序(有时称为分页程序,pagers ),例如 more、page、与 pg ,都常出现在商用UNIX系统上,另外还有 less分页程序。
- 文本编辑器,例如历史悠久的 ed 编辑器、标准的 vi 屏幕编辑器,还有一些插件(add-on)编辑器,例如 emacs、jed、jove、vile、vim 等。
正因为正则表达式对于UNIX的使用是这么重要,所以花些时间把它们弄熟绝对不会错,越早开始就能掌握得越好。
从根本上来看,正则表达式是由两个基本组成部分所建立:一般字符与特殊字符。一般字符指的是任何没有特殊意义的字符,正如下表中所定义的。在某些情况下,特殊字符也可以视为一般字符。特殊字符常称为元字符( metacharacter ),本章接下来的部分都会以 meta 字符表示。
POSIX BRE 与 ERE 的 meta 字符
字符 | BRE/ERE | 模式含义 |
\ | 两者都可 | 通常用以关闭后续字符的特殊意义。有时则是相反地打开后续字符的特殊意义,例如 \( ... \) 与 \{ ... \} 。 |
. | 两者都可 | 匹配任何单个的字符,但 NUL 除外。独立程序也可以不允许匹配换行字符。 |
* | 两者都可 | 匹配在它之前的任何数目(或没有)的单个字符。以ERE而言,此前置字符可以是正则表达式, .* 代表“匹配任一字符的任一长度”。以BRE来说, * 若置于正则表达式的第一个字符,不具任何特殊意义。 |
^ | 两者都可 | 匹配紧接着的正则表达式,在行或字符串的起始处。BRE:仅在正则表达式的开头处具此特殊含义,ERE:置于任何位置都具特殊含义。 |
$ | 两者都可 | 匹配前面的正则表达式,在字符串或行结尾处。BRE:仅在正则表达式结尾处具此特殊含义,RER:置于任何位置都具特殊含义。 |
[...] | 两者都可 | 方括号表达式,匹配方括号内的任一字符。连字符(-)指的是连续字符的范围。^符号置于方括号里第一个字符则有反向含义:指的是匹配不在列表内的任何字符。作为首字符的一个连字符或是结束方括号(]),则被视为列表的一部分。所有其他的 meat 字符也为列表的一部分。房括号表达式里可能会含有排序符号、等价字符集、以及字符集。 |
字符 | BRE/ERE | 模式含义 |
\ {n,m \} | BRE | 区间表达式,匹配在它前面的单个字符重现的次数区间。\{n\}指的是重现 n 次;\{n,\}则为至少重现 n 次,而\{n,m\}为重现 n 至 m 次。m的值必须介于0至255间 |
\ ( \) | BRE | 将\( 与 \) 间的模式存储在特殊的“保留空间”。最多可以将9个独立的子模式存储在单个模式中。匹配于子模式的文本,可以通过转移序列\1至\9,被重复使用在相同模式里,例如\(ab\).*\1,指的是匹配于ab组合的两次重现,中间可存在任何数目的字符。 |
\n | BRE | 重复在\ 方括号内第 n 个子模式至此点的模式。n为1至9的数字,1为由左开始。 |
{n,m} | ERE | 与先前提及BRE的\{n,m\}一样,只不过方括号前没有反斜杠。 |
+ | ERE | 匹配前面正则表达式的一个或多个实例。 |
? | ERE | 匹配前面正则表达式的零个或一个实例。 |
| | ERE | 匹配于|符号前或后的正则表达式。 |
( ) | ERE | 匹配于方括号括起来的正则表达式群。 |
简单的正则表达式匹配范例
表达式 | 匹配 |
tolstoy | 位于一行上任何位置的7个字母:tolstoy |
^tolstoy | 7个字母tolstoy,出现在一行的开头 |
tolstoy$ | 7个字母tolstoy,出现在一行的结尾 |
^tolstoy$ | 正好包括tolstoy这7个字母的一行,没有其他的任何字符 |
[Tt]olstoy | 在一行上的任意位置中,含有 Tolstoy 或是 tolstoy |
tol.toy | 在一行上的任意位置中,含有 tol 这3个字母,加上任何一个字符,再接着toy这3个字母。 |
tol.*toy | 在一行上的任意位置中,含有 tol 这3个字母,加上任意的0或多个字符,再继续 toy 这3个字母。 |