转自:http://blog.csdn.net/a627088424/article/details/15435873
从根本上来看,正则表达式是由两个基本组成部分所建立:一般字符与特殊字符。一般字符指的是任何没有特殊意义的字符。在某些情况下,特殊特殊字符也可以视为一般字符。特殊字符称为元字符(metacharacter)。
BRE:基本正则表达式(Basic Regular Expression)
ERE:扩展的正则表达式(Extended Regular Expression)
POSIX BRE与ERE的meta字符
字符 | BRE/ERE |
模式含义 |
\ | 两者都可 | 通常可以关闭后续字符的特殊含义。有时则是相反的打开特殊含义,例如:\(...)\与\{...\}。 |
. | 两者都可 | 匹配任意单个字符,但NUL除外。独立程序也可以不允许匹配换行字符。 |
* | 两者都可 | 匹配在它之前的任何数目(或没有)的单个字符。 ERE:此前置字符可以是正则表达式,例如:因为.号表示任意字符,所以.*表示“匹配任一字符的任意长度”。 BRE:*若置与正则表达式的第一个字符,不具任何特殊意义。 tol.toy 匹配不到toltoy,而tol.*toy可以。 |
^ | 两者都可 | BRE:仅在正则表达式的开头具有特殊意义,像^abc表示以abc开头的行,而a^b中则表示^本身字面意思。 ERE:置于任何位置都有特殊意义,像ab^cd这样的正则表达式是有效的,只是无法匹配到任何内容,因为^前置了文本,会让其无法匹配到“字符串的开始”。 |
$ | 两者都可 | BRE:仅在正则表达式的结尾具有特殊意义,像abc^表示以abc结尾的行,而a^b中则表示^本身字面意思。 ERE:置于任何位置都有特殊意义,像ab$cd这样的正则表达式是有效的,只是无法匹配到任何内容,因为$后置了文本,会让其无法匹配到“字符串的结尾”。 |
[...] | 两者都可 | 方括号表达式,匹配方括号内的任一字符。 连字符(-)指的是字符范围。 ^符号置于方括号里的第一个字符时,具有反向意义:指的是不在方括号内的任何字符。 作为首字符的一个连字符或结束方括号(]),则被视为列表的一部分。所有其他的meta字符也为列表中的一部分(也就是表示其字面意思,而不具有特殊意义)。 方括号表达式里可能会含有排序字符,等价字符以及字符集。 |
\{n,m\} | BRE | 匹配在它前面的单个字符重现相应次数的行。 \{n\}指重现n次。\{n,\}则为至少重现n次。而 \{n,m\}为重现n到m次。n与m的值必须介于0到RE_DUP_MAX(含)之间,后者最小值为255。RE_DUP_MAX是POSIX定义的符号型常数,且可以通过getconf命令取得。它的最小值为255,不过部分系统允许更大值,如GNU/Linux为32767. |
| BRE | 将\(与\)间的模式存储在特殊的“保留空间”。最多可以将9个独立的子模式存储早单个模式中。匹配于子模式的文本,可以通过转义序列\1至\9,被重复使用在相同的模式里。例如: ab .*\1,指的是匹配于ab组合的两次重现,中间可存在任何数目的字符。 |
\n | BRE | 重复在\(与\)方括号内第n个子模式至此点的模式。n为1至9的数字,1为由左开始。 |
{n,m} | ERE | 与先前提及BRE的 \{n,m\}一样,只不过没有反斜杠。 |
+ | ERE | 匹配前面正则表达式的一个或多个实例。例:ab+c,表示中间有至少有一个b,等同于abb*c。 |
? | ERE | 匹配前面正则表达式的零个或一个实例。例:ab?c匹配的有ac与abc,就这两个。而ab*c,后者匹配中间有任意个b。 |
| | ERE | 匹配|符号前面或后面的表达式。 |
( ) | ERE | 匹配于方括号括起来的正则表达式群。组合。 利用它可以构建复杂而灵活的正则表达式。 例:[Tt]he (CPU|computer) is 例:read|write+指的是正好一个read,或write后面接着任意个数个e字符,比较有使用的模式应该是(read|write)+,值的是有一个read或重现多个read,或则一个write或重现多个write。 例:(read|write)+所指的字符串间不能有空白。((read|write)[[:space:]]*)+则是用以匹配多个连续出现的read或是write,且中间可能被空格隔开。 |
POSIX的方括号表达式:
为配合非英语环境,POSIX标准强化其字符集范围的能力。[a-z]表示a到z的小写英文,而法文è是字母字符,但是却不在[a-z]中。有例如,在Czech与Spanish语系下,ch两个字符会保持连续状态,在匹配时会被视为单个独立单位。
POSIX也在术语上做了变动,早先看到的[]称为字符集(character class),在POSIX标准下,现在叫括号表达式(bracket expression)。对原先进行了扩充。
另有额外的组成部分。
包括:
字符集(Character class)
以[:与:]将关键字组合起来的POSIX字符集。关键字表示各种不同的字符集。
排序符号(Collating symbol)
排序符号指将多个字符序列视为一个单位。使用[.与.]将字符组合起来。排序符号在系统所使用的特定locale上各有其定义。
等价字符集(Equivalence class)
等价字符集列出的是应十二位等值的一组字符,例如e与è。它由取自于locale的名字元素组成,以[=与=]括住。
这三种构造都必须使用方括号表达式。例如[[:alpha:]!]匹配任一英文字母字符或惊叹号(!);而[[.ch.]]则匹配于ch,而不是字母c或h。在法文French的locale里,[[=e=]]可能匹配于e,é,è,ê,ë。
需要注意写法,像[:alpha:]这样,是匹配:,a,l,p,h,a,,表示匹配英文字母的正确写法应为[[:alpha:]]。要让]进入集合中,必须将它放在列表前,如:[]*\.]。要让减号-进入该集合,也请将它放在列表最前端。要让他两同时进入列表,请将右方括号放在第一个字符,减号放到最后一个字符,如[]*\.-]
POSIX字符集:
类别 | 匹配字符 |
[:alnum:] | 数字字符 |
[:alpha:] | 字母字符 |
[:blank:] | 空格(space)与定位符(tab) |
[:cntrl:] | 控制字符 |
[:digit:] | 数字字符 |
[:graph:] | 非空格字符(nonspace) |
[:lower:] | 小写字母字符 |
[:print:] | 可显示字符 |
[:punct:] | 标点符号字符 |
[:space:] | 空白字符 |
[:upper:] | 大写字母字符 |
[:xdigit:] | 十六进制数字 |
最后,POSIX明确陈述:NUL字符(数值的零)不需要时刻匹配的。这个字符在C语言里是用来指出字符串结尾,而POSIX标准则希望让它是直接了当的,通过正规C字符串的使用实现其功能。除此之外,另有其他个别的工具程序不允许使用.(点号)meta字符或方括号表达式来进行换行字符匹配。
连字符依然可以用
[0-9a-fA-F]可以表示十六进制数字[0123456789abcdefABCDEF]
[0-9]表示[0123456789]
....
[^]不是有效的正则表达式。可以这样匹配^,[\ ^]
BRE运算符优先级
由高到底:
[..] [==] [::] 用于字符排序的方括号表达式 |
\metacharacter 转义的mera字符 |
[] 方括号表达式 |
\digit 子表达式与后项引用 |
* \{ \} 前置单个字符重现的正则表达式 |
无符号(no symbol) 连续 |
^ $ 锚点(Anchors) |
ERE运算符优先级
[..] [==] [::] 用于字符排序的方括号表达式 |
\metacharacter 转义的mera字符 |
[] 方括号表达式 |
( ) 分组 |
* + ? {} 重复前置的表达式 |
无符号(no symbol) 连续 |
^ $ 锚点(Anchors) |
| 交替(Alternation) |
正则表达式的扩展
很多程序提供正则表达式语法扩展。这类扩展大多采用取反斜杠加一个字符,以形成新的运算法。最常见的扩展为\<和\>运算法。表示匹配单词的开头和结尾。对用正则表达式的扩展,请查看手册页。
额外的GNU正则表达式运算符
运算法 | 含义 |
\w | 匹配任何单词组成字符,等同于[[:alnum:]_] |
\W | 匹配任何单词组成字符,等同于[^[:alnum:]_] |
\< \> | 如前所述 |
\b | 匹配单词的起始或结尾处所找到的空字符串。这是\<与\>的结合。主要以awk使用\b表示后退字符,因此GNU awk(gawk)使用\y表示此功能。 |
\B | 匹配两个单词组成字符之间的空字符串 |
\’ \` | 分别匹配emacs缓冲区的开始和结尾。GNU程序(还有emacs)通常将它们视为与^及$同义 |
POSIX表示NUL无需匹配,但GNU程序则没有限制。如NUL字符出现在输入数据里,则可以通过.字符或方括号表达式来匹配。