POSIX BRE和ERE的metacharacters(元字符)

来源:互联网 发布:java调用nodejs程序 编辑:程序博客网 时间:2024/05/22 10:34

转自: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\}为重现nm次。nm的值必须介于0RE_DUP_MAX()之间,后者最小值为255。RE_DUP_MAX是POSIX定义的符号型常数,且可以通过getconf命令取得。它的最小值为255,不过部分系统允许更大值,如GNU/Linux为32767.

  

   BRE

将\(\)间的模式存储在特殊的“保留空间”。最多可以将9个独立的子模式存储早单个模式中。匹配于子模式的文本,可以通过转义序列\1\9,被重复使用在相同的模式里。例如:ab.*\1,指的是匹配于ab组合的两次重现,中间可存在任何数目的字符。

    \n

   BRE

重复在\(\)方括号内第n个子模式至此点的模式。n19的数字,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字符出现在输入数据里,则可以通过.字符或方括号表达式来匹配。

0 0
原创粉丝点击