1. POSIX定义的基本正则表达式(Basic Regular Expression, BRE) , 扩展正则表达式(Extended Regular Expression, ERE)。grep 使用的是BRE, egrep 使用的是ERE。fgrep 也叫快速grep (Fast grep),这个版本匹配固定字符串而非正则表达式,也是唯一可以并行地匹配多个字符串的版本。
2. POSIX BRE 与 ERE的meta字符(元字符即特殊字符)
字符 BRE/ERE 模式含义
\ 两者都可 通常用以关闭后续字符的特殊意义。有时则是相反地打开后续字符的特殊意义,如:\(...\) 与
\{...\} 。
. 两者都可 匹配任何单个的字符,但NUL除外。独立程序也可以不允许匹配换行字符。
* 两者都可 匹配在它之前邻接的任何数目的单个字符(0~n),对于BRE来说,*如果置于正则表达式的第一个 字符,不具有任何特殊意义。
^ 两者都可 匹配紧接着的正则表达式,在行或字符串的起始处。BRE:仅在正则表达式的开头处具有特殊 含义,ERE:置在任何位置都具有特殊含义。
$ 两者都可 匹配前面的正则表达式,在字符串或行结尾处。BRE:仅在正则表达式结尾处有特殊含义。 ERE:置于任何位置都具有特殊含义。
[...] 两者都可 方括号表达式,匹配方括号内的任一字符。连字符(-)指的是连续字符的范围(注意:范围会 因为locale而有所不同,因此不具有可移植性)。^符号置于方括号里第一个字符则有反向含 义:指的是匹配不在列表内(方括号内)的任何字符。作为首字符的一个连字符或是结束 方括号( ] ),则被视为列表的一部分。所有其他的meta字符也为列表的一部分(则被视 为字面上的意义)。方括号表达式里可能会含有排序符号、等价字符集,及字符集。
\{n,m\} BRE 区间表达式,匹配在它前面的单个字符重现的次数区间。\{n\}指的是重现n次;\{n, \}则为至少 重现n次,而\{n,m\}为重现n至m次。n与m的值必须介于0至RE_DUP_MAX(含)之间,后者最 小值为255。
\( \) BRE 将\(与\)间的模式存储在特殊的"保留空间"。最多可以将9个独立的子模式存储在单个模式中。匹 配于子模式的文本,可通过转义序列\1至\9,被重复使用在相同的模式里。例如\(ab\).*\1(等 同于\(ab\).*\(ab\)) ),指的是匹配于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个字母
3. 字符集、排序符合、等价字符集
字符集是以[:与:]将关键字组合括起来的POSIX字符集。
POSIX字符集: 类别 匹配字符 类别 匹配字符
[:alnum:] 数字字符 [:lower:] 小写字母
[:alpha:] 字母字符 [:print:] 可显示的
[:blank:] 空格(space)与定位(tab)字符 [:punct:] 标点符号
[:cntrl:] 控制字符 [:space:] 空白(whitespace)字符
[:digit:] 数字字符 [:upper:] 大写字母字符
[:graph:] 非空格(nonspace)字符 [:xdigit:] 十六进制数字
注意:排序元素、等价字符集以及字符集,都仅在方括号表达式的方括号内认可,也就是说,像[:alpha:]这样的正则表达式,匹配字符为a、l、p、h以及:,表示所有英文字母的正确写法应为[[:alpha:]]。在方括号表达式中,所有其他的meta字符都会失去其特殊含义。所以[*\.]匹配于字面上的星号、反斜杠以及句点。
4. 后向引用
BRE提供了一种叫后向引用的机制,指的是"匹配于正则表达式匹配的先前部分"。使用后向引用的步骤有两个。第一步是将子表达式包围在 \(与\) 里;单个模式里可包括至多9个子表达式,且可为嵌套结构。如:\(ab\)\(cd\)[def]*\2\1,\1指代了 \(ab\) ,\2指代了\(cd\),则\(ab\)\(cd\)[def]*\2\1 等同于 \(ab\)\(cd\)[def]*\(ab\)\(cd\)。
5. *号,可以匹配0个或者多个前面的单个字符。因此ab*c,可以"匹配1个a、0个或多个b字符以及一个c"。则这个正则表达式可以匹配的是ac、abc、abbc、abbbc、abbbbc、....
6. ^ 和 $ 这两个meta字符也叫做锚点,其用途限制正则表达式匹配时,针对要被匹配字符串的开始或者结尾处进行匹配(^跟在[^]中括号里面的意义不一样。)以下举例锚点匹配 abcABCdefDEF 字符串的范例:
模式 是否匹配 匹配文本(红色)/匹配失败的理由
ABC 是 居中的第4、5、6字符:abcABCdefDEF
^ABC 否 限定匹配字符串的起始处
def 是 居中的第7、8、9个字符:abcABCdefDEF
def$ 否 限制匹配字符串的结尾处
[[:upper:]]\{3\} 是 居中的第4、5、6个字符:abcABCdefDEF
[[:upper:]]\{3\}$ 是 结尾的第10、11、12个字符:abcABCdefDEF
^[[:alpha:]]\{3\} 是 起始的第1、2、3个字符:abcABCdefDEF
^与$仅在BRE的起始与结尾处具有特殊用途。在BRE下,ab^cd里的^表示的,就是自身的(^),ef$gh,同样是表示字面上的货币字符。
7. BRE运算符优先级,由高至低 ERE运算符优先级,由高到低
运算符 表示意义 运算符 表示意义
[. .] [= =] [: :] 用于字符排序的方括号符号 [. .] [= =] [: :] 用于字符对应的方括号符号
\meta character 转义的meta字符 \meta character 转义的meta字符
运算符 表示意义 [ ] 方括号表达式
[ ] 方括号表达式 ( ) 分组
\( \) \digit 子表达式与后向引用 * + ? { } 重复前置的正则表达式
* \{ \} 前置单个字符重现的正则表达式 无符号(no symbol) 连续字符
无符号 (no symbol) 连续 ^ $ 锚点
^ $ 锚点 | 交替
8. ERE中没有后向引用,所有\(与\)匹配就是字面上的左括号与右括号。匹配多字符上的*的处理上和BRE是相同的。在BRE和ERE中的次数重复写法是不同的,BRE中的\{5},ERE写成{5},重复10到42个q的写法,BRE中是q\{10,42\},在ERE中是q{10,42}。
9. ERE另外有两个meta字符,可以更细腻地处理匹配控制:
? 匹配于0个或一个前置正则表达式 + 匹配于1个或多个前置正则表达式
ab?c 匹配的有ac、abc ab+c 匹配的有abc、abbc、abbbc,却不匹配ac
10. | 运算符,可以理解成或的意思,满足其一即可。( ) 分组可以理解成数学中的括号。
11. 正则表达式的扩展,常见的扩展为 \< 与 \>运算符,分别匹配"单词(word)"的开头与结尾。如: \
12. 额外的GNU正则表达式运算符
运算符 含义
\w 匹配任何单词组成字符,等同于[[:alnum:]_]
\W 匹配任何非单词组成字符,等同于[^[:alnum:]_]
\< \> 匹配单词的起始与结尾,如前文所述
\b 匹配单词的起始或结尾处所找到的空字符串。这是\< 与 \>运算符的结合注意由于awk使用\b表示后退字符,因此GNU
awk(gawk)使用\y来表示此功能
\B 匹配两个单词组成字符之间的空字符串
\' \` 分别匹配emacs缓冲区的开始与结尾。GNU程序(还有emacs)通常将他们视为与^及$同义
13.UNIX程序及其正则表达式类型
类型 grep sed ed ex/vi more egrep awk lex
BRE * * * * *
ERE * * *
\< \> * * * * *