在正则表达式中,被赋予特殊含义的字符称为元字符。处理正则表达式的软件被称作正则引擎。一些主要的元字符在不同的正则引擎上是相同的,但也有很大一部分元字符在不同的正则引擎上是不同的。不同的元字符势必会导致不同的正则表达式,当下主流的正则表达式可以分为以下三类:
- POSIX Basic Regular Expression:POSIX 基本正则表达式,简写作 BREs。由于是 POSIX 的标准,所以 Unix/Linux 衍生平台上的大部分软件都支持 BREs。
- POSIX Extended Regular Expression:POSIX 扩展的正则表达式,简写作 EREs。相较于 BREs,EREs 在 Unix/Linux 衍生平台上被支持的范围更大。
- Perl Regular Expression:Perl 正则表达式,简写作 PREs。Perl 是较早支持正则表达式的语言,其正则引擎的速度也优于其它语言,因此 PREs 无疑是领头羊的存在。JAVA、Python 等当下流行的编程语言,它们的正则表达式也在很大程度上借鉴了 PREs。
因此,要想熟练使用 Unix/Linux 衍生平台,BREs 和 EREs 是必备的技术,毕竟二者有着 POSIX 光环。BREs 和 PREs 仅有匹配功能,而 PREs 具有三种模式,分别是:匹配、替换、转化。本文首先在匹配方面来比较 BREs、EREs 和 PREs,而后再分别介绍 PREs 的替换模式和转化模式。
匹配
首先介绍几个概念:在正则表达式中被赋予特殊含义的符号被称为元字符。按照正则表达式的语法写成的字符串被称为模式串(pattern string)。
功能 | 为演示功能而作的假设 | 在 BREs 中的写法 | 在 EREs 中的写法 | 在 PREs 中的写法 |
---|---|---|---|---|
转义字符 | \ | \ | \ | |
代指任意字符(不包括\n 和\r ) | . | . | . | |
代指几个字符中的任意一个字符 | 假设代指abc 中的一个字符 | [abc] | [abc] | [abc] |
代指指定范围内的任意一个字符 | 假设代指从a 到z 中的一个 | [a-z] | [a-z] | [a-z] |
代指除指定字符之外的任意一个字符 | 假设代指除小写字母和123 之外的字符 | [^a-z123] | [^a-z123] | [^a-z123] |
代指两个字符中的任意一个 | 假设代指xy 中的任意一个 | 不支持 | x|y | x|y |
代指由同一字符组成的序列,且序列长度为确定值 | 假设代指仅由a 组成的序列,且长度为4 | a\{4\} | a{4} | a{4} |
代指由同一字符组成的序列,且序列长度的最小值为确定值;最大值不限 | 假设代指仅由b 组成的序列,且长度最小值为5 | b\{5,\} | b{5,} | b{5,} |
代指由同一字符组成的序列,且序列长度的最小值和最大值都为确定值 | 假设代指仅由c 组成的序列,且长度最小为6 ;最大为10 | c\{5,10\} | c{5,10} | c{5,10} |
代指由同一字符组成的序列,且序列长度最小为零,最大不限 | 假设代指仅由d 组成的序列,且长度为非负整数 | d* | d* | d* |
代指由同一字符组成的序列,且序列长度最小为一,最大不限 | 假设代指仅由e 组成的序列,且长度为正整数 | 不支持 | e+ | e+ |
代指由同一字符组成的序列,且序列长度为零或一 | 假设代指仅由f 组成的序列,且长度零或一 | 不支持 | f? | f? |
代指每行行首字符前的虚拟字符(正则引擎在每行的行首字符前虚拟了一个字符) | ^ | ^ | ^ | |
代指每行行尾字符后的虚拟字符(正则引擎在每行的行尾字符后虚拟了一个字符) | $ | $ | $ | |
代指每个单词首字符前的字符(单词指由大小写字母、数字和下划线构成连续序列) | 不支持 | \< | 不支持 | |
代指每个单词尾字符后的字符 | 不支持 | \> | 不支持 | |
代指每个单词词首前或词尾后的字符(单词指由大小写字母、数字和下划线构成连续序列) | 不支持 | 不支持 | \b | |
将某一模式串包装成一个整体,嵌入到另一模式串中,成为一个子模式 | \(\) | () | () | |
在本模式串中,引用前面的一个子模式(能被引用的子模式只有九个,按从前向后的顺序从1 到9 依次编号) | 假设引用从前往后排第6 的子模式 | \6 | \6 | 不支持 |
代指空字符 | 不支持 | 不支持 | \0 | |
代指换行符 | 不支持 | 不支持 | \n | |
代指回车符 | 不支持 | 不支持 | \r | |
代指水平制表符 | 不支持 | 不支持 | \t | |
代指垂直制表符 | 不支持 | 不支持 | \v | |
代指换页符 | 不支持 | 不支持 | \f | |
代指任意不可见字符(包括:空格、换行、回车、水平制表、垂直制表和换页) | 不支持 | 不支持 | \s | |
代指任意可见字符 | 不支持 | 不支持 | \S | |
代指任意数字字符 | 不支持 | 不支持 | \d | |
代指任意非数字字符 | 不支持 | 不支持 | \D | |
代指任意单词字符(包括大写字母、小写字母、数字和下划线) | 不支持 | 不支持 | \w | |
代指任意非单词字符 | 不支持 | 不支持 | \W | |
使用两位十六进制 ASCII 码来代指字符 | 假设代指A (其 ASCII 码为0x41 | 不支持 | 不支持 | \x41 |