扩展正则表达式(ERE)
拥有笔记本正则表达式更多的功能.BRE与ERE在大多数的meta字符与功能应用上几乎是完全一致,单ERE理由写meta字符看起来与BRE类似,却具有完全不同的类型.
扩展正则表达式与基础正则表达式的唯一区别在于:? + () {} 这几个字符。
基础正则表达式中,如果你想? + () {}表示特殊含义,你需要将他们转义
而扩展正则表达式中,如果你想? + () {} 不表示特殊含义,你需要将他们转义。
转义符号,都是一样的,\符号。
所谓特殊含义,就是正则表达式中的含义。非特殊含义,就是这个符号本身。
例如
[[email protected] ~#] echo aaa|grep 'a?';[[email protected] ~#] echo aaa|grep 'a\?';aaa#egrep使用的是扩展正则表达式[[email protected] ~#] echo aaa|egrep 'a?';aaa[[email protected] ~#] 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优先级最低的.