10.1.3 扩展的正则表达式

顾名思义,扩展的正则表达式一定是针对基础正则表达式的一些补充。实际上,扩展正则表达式比基础正则表达式多了几个重要的符号。不过要注意的是,在使用这些扩展符号时,需要使用egrep命令。

·“?”符号

“?”符号用于匹配前一个字符0次或1次,所以“ro?t”仅能匹配rot或rt。

·“+”符号

“+”符号用于匹配前一个字符1次以上,所以“ro+t”就可以匹配rot、root等。

·“|”符号

“|”符号是“或”的意思,即多种可能的罗列,彼此间是一种分支关系。比如说有些地区固定电话的区号是4位数,有些地方却是3位数,这样针对不同的区号就有不同的固定电话的表示方式,如下所示:


  1. #
  2. 区号是3
  3. 位的固定电话的正则表达式方式
  4. ^0[0-9]\{2\}-[0-9]\{8\}
  5. #
  6. 区号是4
  7. 位的固定电话的正则表达式方式
  8. ^0[0-9]\{3\}-[0-9]\{8\}
  9. #
  10. 两种区号的固定电话号码可以如下写
  11. ^0[0-9]\{2,3\}-[0-9]\{8\}
  12. #
  13. 使用"|"
  14. 符号也可以,但是显然比上面的方式麻烦
  15. ^0[0-9]\{2\}-[0-9]\{8\}|^0[0-9]\{3\}-[0-9]\{8\}

·“()”符号

“()”符号通常需要和“|”符号联合使用,用于枚举一系列可替换的字符。比如说固定电话的区号和电话号码之间,可能用“-”符号或者用一个空格连接,用于匹配的正则表达式如下:


  1. #
  2. 使用"()"
  3. "|"
  4. 定义连接符的写法
  5. #
  6. 这样021-88888888
  7. 0511 88888888
  8. 都可以匹配
  9. ^0[0-9]\{2,3\}(-| )[0-9]\{8\}
  10. #
  11. 这种写法可以换用"[]"
  12. 符号表示
  13. ^0[0-9]\{2,3\}[\ \-][0-9]\{8\}

虽然以上这两种写法没有本质的不同,因为“()”和“|”可以和“[]”相互混用,但是在某些场景下,“()”和“|”可以做得更多,比如说像hard、hold或hood等这类开头和结尾的字母都一样的单词,要匹配这些就必须使用“()”和“|”了。如下所示:


  1. #
  2. 使用"()"
  3. "|"
  4. 匹配hard
  5. hold
  6. hood
  7. h(ar|oo|ol)d