离线下载
PDF版 ePub版

见证大牛成长之路 · 更新于 2018-11-28 11:00:43

shell 学习第八天---扩展正则表达式(ERE)

扩展正则表达式(ERE)

拥有笔记本正则表达式更多的功能。BRE 与 ERE 在大多数的 meta 字符与功能应用上几乎是完全一致,单 ERE 理由写 meta 字符看起来与 BRE 类似,却具有完全不同的类型。

扩展正则表达式与基础正则表达式的唯一区别在于:? + () {} 这几个字符。

基础正则表达式中,如果你想? + () {}表示特殊含义,你需要将他们转义
而扩展正则表达式中,如果你想? + () {} 不表示特殊含义,你需要将他们转义。

转义符号,都是一样的,\符号。
所谓特殊含义,就是正则表达式中的含义。非特殊含义,就是这个符号本身。

例如
[root@shellcn.net ~#] echo aaa|grep 'a?'[root@shellcn.net ~#] echo aaa|grep 'a\?';aaa#egrep 使用的是扩展正则表达式[root@shellcn.net ~#] echo aaa|egrep 'a?'aaa[root@shellcn.net ~#] echo aaa|egrep 'a\?'

可见,扩展正则表达式与基础正则表达式的区别,就是它们加不加转义符号,代表的意思刚好相反。

ERE 历史没有后向引用的。圆括号在ERE里具有特殊含义,但和 BRE 里使用的又有所不同。在ERE里, \ ( 与 \ )匹配的是字面上的左括号与右括号。

匹配单个表达式与多个正则表达式
ERE 在匹配多字符这方面,与 BRE 有明显的不同,不过在(*)的处理上和 BRE 是相同的。

注意:有一个例外,*作为 ERE 的第一个字符是“未定义的”,而在 BRE 中它是指“符合字面的”。
一般情况下使用 grep 控制 BRE,使用 egrep 控制 ERE。
使用 ERE 匹配我们之前介绍过的离子“要刚好重现 5 个 a”以及“重现 10 个至 42 个 q”,写法分别为:a{5}q{10,42}。而{与}则可以匹配字面上的花括号。当在 ERE 里{找不到匹配}时,POSIX 特意保留其含义为“未定义状态”。

ERE 另有两个 meta 字符,可更细腻的处理匹配控制:
? 匹配于 0 个或一个前置正则表达式
+ 匹配于一个或多个前置正则表达式
可以把?想象成是“可选用的”,也就是说,匹配前置正则表达式的文,要么出现,要么没出现。例如:与 ab?c 匹配的有 ac 与 abc,就这两者 ! (与 ab*c 相较之下,后者匹配于中间有人一个 b)。

+字符在概念上与* meta字符类似,不过前置正则表达式要匹配的文本在这里至少得出现一次。例如ab+c匹配于 abc,abbc,abbbc,但是不匹配于 ac。

ab+c的正则表达式等价于 abbc;无论如何,当前值正则表达式很复杂时,使用+可以少打一点字,这就减少了打错字的几率。

交替

方括号运算符一宇表示“匹配于次祖父,或其他字符,或...”,但不能指定“ 匹配于这个序列,或其他序列”。要达到后者的目的,可以使用管道运算符 ( | )。例如read | write匹配于 read 与 write 两者,fast|slow匹配于 fast 与 slow。
| 字符是 ERE 运算符;i 优先级最低的。

上一篇: 基础正则表达式(... 下一篇: 分组