Chinaunix首页 | 论坛 | 博客
  • 博客访问: 309361
  • 博文数量: 60
  • 博客积分: 2579
  • 博客等级: 大尉
  • 技术积分: 570
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-17 14:54
文章分类

全部博文(60)

文章存档

2011年(1)

2010年(1)

2009年(35)

2008年(23)

分类:

2008-06-10 13:08:19

正则表达式
正则表达式(REGULAR EXPRESSIONS)提供一种从字符串集中选取特殊字符串的机制,国际化正则表达式支持基本的及扩展的正则表达式,并且支国际特征字符类,等价类和多字符比较。

1.   基本正则表达式

l        匹配单字符的基本正则表达式

它包括:普通字符,由(\)前导特殊字符,匹配单个字符的句点(.),匹配单个字符或单个比较元素的括号表达式。

l        普通字符

普通字符仅用来匹配自身,它是所支持的字符集中除特殊字符外的任何字符。由(\)前导的普通字符未被定义,除了:字符‘)’,‘(’,‘{’,和‘}’,1-9之间的数字及括号表达式中的字符。

l        特殊字符

特殊字符仅在特殊的上下文中才具有特殊的意义。当超出该上下文,或者由(\)前导时,它们只用于匹配特殊字符本身。特殊字符及其所需的上下文如下:
. [ \
除了用于括号表达式之外,句点‘.’左括号‘[’与反斜线‘\’的组合具有特殊的意义。表达式中的‘[’或者由‘\’前导,或者是括号表达式的一部分。
*
星号具有特殊的意义,除了下列情况:
·   处于括号表达式中
·   作为整个基本正则表达式的首字符(可能在抑扬字符词首后,如果有的话)
·   作为子表达式的首字符(可能在抑扬字符词首后,如果有的话)
 
^
在下列情况下,抑扬字符具有特殊的意义:
·   作为锚
·   作为括号表达式的首字符
$
美元号用于锚时具有特殊的意义。

l        基本正则表达式中的句点

括号表达式外的句点用于匹配所支持字符集内的任意字符(空字符(NUL)除外).

l        括号表达式

括号表达式(由方括号括起的表达式)用于匹配由括号表达式所描述的非空比较元素集内的单个比较元素。
括号表达式或者是匹配列表表达式,或者是不匹配列表表达式。它由一个或多个下列表达式组成:比较元素,比较符号,等价类,字符类,或者范围表达式。可移植应用程序不应使用范围表达式。如果右括号‘]’处在括号表达式列表之首(可能在抑扬字符词首后,如果有的话),它将仅代表自身而失去特殊意义。否则,它结束括号表达式,除非它出现在比较符号中,例如[.].],或是比较符号,等价类,字符类等的右终结括号。
当句点,星号,左括号,反斜线各自处于括号表达式中时,它们都将失去特殊的意义。
左括号后跟句点,等号或冒号在括号表达式中具有特殊的意义。它们被用来界定比较符号,等价类表达式,和字符类表达式,这些符号必须后跟合法的表达式,并以相应的‘.]’,‘=]’,‘:]’符号结尾。
匹配列表表达式匹配该列表表达式中任意一个表达式。列表的首字符不能是‘^ ’。例如,表达式[abc]匹配字符a,bc中的任意一个。
非匹配列表表达式由(^)开头,它与匹配列表表达式恰恰相反,其匹配除列表中所描述的表达式匹配之外的任意字符或比较元素。
比较符号由比较元素和([..])定界符组成。当多字符比较元素必须与组成多字符比较元素的单个字符的序列区别开来时,它们必须被表示成为比较符号。
????等价类表达式表示属于某一等价类所有比较元素的集合,只有主要的等价类被识别。它由等价类中任意一个比较元素和([==])定界符组成。如果比较元素不属于某一等价类,等价类表达式将被视为比较符号。????
字符类表达式表示属于一个字符类的所有字符的集合,该字符类在当前环境中的LC_CTYPE中定义。在当前环境中定义的所有字符类均可被识别。字符类表达式由字符类名和定界符([::])所构成。下列字符类表达式在所有场合均被支持:
 [:alnum:]
[:cntrl:]
[:lower:]
[:space:]
[:alpha:]
[:digit:]
[:print:]
[:upper:]
[:blank:]
[:graph:]
[:punct:]
[:xdigit:]
另外,下列形式的字符类表达式[:name:]仅在关键字name已在LC_CTYPE中定义的环境中被识别。
范围表达式表示界于两个比较元素之间的元素集合。通常表示为起始元素-结束元素。范围表达式不要用于可移植应用程序,因为它们依赖于比较序列,而比较序列的解释在不同环境可能有所不同。例如,如果一个比较序列定义变量a在另一个比较序列被定义为跟随z的字符,那么表达式[-z]在第一种语言中是合法的,而在第二种语言中却是非法的。下列所有的示例都假定处于POSIX环境,除非特殊指明。
起始元素和结束元素必须为比较元素或比较符号。等价类表达式不能用于范围表达式的起始或结束元素。等价类表达式可以用于括号表达式,但只能在范围表达式之外。例如,表达式[[=e=]-f]应该改为[[=e=]e-f]。结束元素必须大于或等于起始元素,否则表达式将视为非法。
假定字符β在比较序列中位于r和s之后,而在t之前,那么表达式[r-s]只匹配r和s,而表达式[s-t]则匹配s,β或t。如下的比较表达式串联法[a-m-o]未被定义。
连字号字符出现在列表的首位(可能在抑扬字符词首后,如果有的话)和末尾,或者作于范围表达式结束元素时,将被视为连字符本身。例如,表达式[-ac]与[ac-]是等价的,它们匹a,c,或-;表达式[^-ac]与[^ac-]同样是等价的,它们匹配除a,c,和-之外的任意字符;表达式[%- -]匹配界于%与-之间的任意字符;表达式[- -@]匹配界于-与@之间的任意字符;表达式[a- -@]则是非法的。
要将连字符作为范围表达式的起始元素,它必须或是处于括号表达式的首位,或是被表示为比较符号,例如,表达式[][.-.]-0]匹配‘]’或者界于‘-’与‘0’之间的元素。如果括号表达式同时指定‘-’和‘]’,‘]’必须置于首位,同时‘-’放在末尾。

l        匹配多字符的基本正则表达式

基本表达式的串联匹配字符串的串联,这些字符串与串联的基本表达式中每个字符都匹配。
子表达式由‘\(’和‘\)’括起的基本表达式组成。这样的子表达式匹配任何所能匹配的字符,除子表达式包涵锚定的情况外。子表达式可以任意嵌套。
反向指针表达式\n匹配其前导子表达式(由\(和\)括起)所匹配的字符串(可能为空)。字符n必须为1-9之间的数字。
如果前导\n的子表达式少于n个,则表达式为非法。例如,表达式^\(.*\)\1$匹配只由两个相临相同字符串组成的行。指向子表达式的反向指针最多为9个,这是因为只有9个数字符号。但这并不意味着正则表达式中只能最多有9个子表达式,例如下面便是拥有十个子表达式的BRE。


\(\(\(ab\)*c\)*d\)\(ef\)*\(gh\)\{2\}\(ij\)*\(kl\)*\(mn\)*\(op\)*\(qr\)*
 
当匹配单字符的基本表达式,子表达式或反向指针表达式后跟特殊字符星号时,它们与星号一起匹配零个或多个连续出现的基本表达式所匹配物。例如表达式[ab]*[ab][ab]在匹配字符串ab时是等效的。
当一个基本表达式匹配单个字符时,子表达式或反向指针表达式后跟\{m\},\{m,\},或\{m,n\}形式的间隔表达式,与间隔表达式一起它匹配连续重复出现的基本表达式所能匹配的字符。M与n为满足0 m n {RE_DUP_MAX}的十进制整数,其中m为发生次数的准确值或最小值,n为发生次数的最大值。表达式\{m\}匹配前导表达式所能匹配的字符连续m次出现的情况,表达式\{m,\}匹配至少连续m次出现的情况,表达式\{m,n\}匹配重复出现次数界于m与n之间的情况。例如,对于字符串“abababccccccd”,基本表达式c\{3\}匹配第7-9位字符,基本表达式\(ab\)\{4,\}则无法匹配,基本表达式c\{1,3\}d匹配第10-13位字符。
 
多个连续出现的复制符号(上述的星号与间隔表达式)的情况未被定义。

l        基本正则表达式的优先级

 
BRE Precedence (from high to low)
collation-related bracket symbols
[= =] [: :] [. .]
escaped characters
\<special character>
bracket expression
[ ]
subexpressions/back-references
\( \) \n
single-character-BRE duplication
* \{m,n\}
concatenation
 
anchoring
^ $

l        BRE锚定表达式

基本表达式可有限的用于匹配一行开始或结尾的字符串,这被称为锚定。特殊字符抑扬符号与美元号在下列情况下被视为锚:
抑扬符号为整个基本表达式的首字符时。以抑扬字符开头的子表达式也可能被当作锚。抑扬符号将会锚定表达式于字符串的起始位置,仅当基本表达式匹配从字符串第一位开始的字符序列时。例如基本表达式^ab匹配字符串abcdef,而不能匹配字符串cdefab。可移植的基本表达式应避免在子表达式开头使用抑扬字符去匹配其本身。
当美元字符作为整个基本字符串的结尾字符时。以美元字符结尾的子表达式也可能被当作锚。美元符号将会锚定表达式于所匹配字符串的末尾,亦即基本表达式要匹配字符串末尾的字符序列。
当抑扬字符与美元号同时作用于同一基本表达式时,它仅能匹配整个字符串。例如,基本表达式^abcdef$仅能匹配字符串abcdef
抑扬字符^与美元号$在子表达式中不再具有特殊意义。
 
 

2.     扩展正则表达式

基本表达式的规则对扩展表达式同样适用,除了下列情况:
·         字符|,+,和?具有特殊的意义。
·         当字符{与}被用于复制操作时,不再有反斜线前导符。表达式\{ and \}简单的匹配字符序列{ and }
·         不再支持向后参考操作符
·         子表达式支持锚定操作(^$)。
 

l        匹配单字符的扩展正则表达式

它包括:普通字符,由(\)前导特殊字符,匹配单个字符的句点(.),匹配单个字符或单个比较元素的括号表达式。
匹配由圆括号括起的单字符的扩展表达式与匹配无圆括号的单字符的扩展表达式相同。

l        普通字符

普通字符仅用来匹配自身,它包括所支持的字符集中除特殊字符外的任何字符。由‘\’前导的普通字符未被定义。

l        特殊字符

特殊字符仅在特殊的上下文中才具有特殊的意义。当超出该上下文,或者由(\)前导时,它们只用于匹配特殊字符本身。特殊字符及其所需的上下文如下:
. [ \ (
句点‘.’左括号‘[’,反斜线‘\’与左圆括号‘(’仅在括号表达式之外具有特殊的意义。在括号表达式之外,一个左圆括号后立即跟右圆括号未被定义。
)
右圆括号与左圆括号相匹配,并且均处于方括号表达式之外时具有特殊的意义。
*+?{
仅在方括号表达式之外具有特殊的意义。下列的用法未被定义:
·   如果这些字符出现在扩展正则表达式之首,或者紧随‘|’,抑扬符号或左圆括号时
·   如果‘{’不是合法的间隔表达式的一部分。
|
当用于括号表达式外时‘|’具有特殊的意义。字符‘|‘出现在扩展正则表达式开头或结尾,或者紧随’|‘或‘(’,或者前导‘)’的情况均未被定义
^
在下列情况下,抑扬字符具有特殊的意义:
·   作为锚
·   作为括号表达式的首字符
$
美元号用于锚时具有特殊的意义。

l        扩展正则表达式中的句点

括号表达式外的句点用于匹配所支持字符集内的任意字符(空字符(NUL)除外).

l        扩展正则表达式的括号表达式

扩展正则表达式的括号表达式的规则与基本正则表达式的相同。

l        EREs多字符匹配

下面的规则用于构造匹配多个字符的扩展正则表达式:
串联的扩展正则表达式匹配串联的字符序列,该字符序列中的各个字符序列依次被表达式中各部件匹配。由圆括号括起的串联的扩展正则表达式与没有圆括号的具有相同的匹配效果。例如:扩展正则表达式cd(cd)均匹配字符串abcdefabcdef的第三位与第四位字符。
当匹配单字符的扩展正则表达式或由圆括号括起的扩展正则表达式后跟字符(+)时,它们一起匹配该扩展正则表达式所能匹配物的一个或多个连续重复序列。例如,扩展正则表达式b+(bc)匹配字符串acabbbcde的第4-7个字符;表达式[ab]+与[ab][ab]* 是等价的。
当匹配单字符的扩展正则表达式或由圆括号括起的扩展正则表达式后跟特殊字符(*)时,它们与星号一起匹配零个或多个连续出现的表达式所匹配物。
当匹配单字符的扩展正则表达式或由圆括号括起的扩展正则表达式后跟特殊字符(?)时,它们与问号一起匹配零个或一个连续出现的表达式所匹配物。
当匹配单字符的扩展正则表达式或由圆括号括起的扩展正则表达式后跟{m},{m,}或{m,n}形式的间隔表达式时,它们一起匹配连续重复出现的表达式所匹配物。m与n为满足0 m n {RE_DUP_MAX}的十进制整数,其中m为发生次数的准确值或最小值,n为发生次数的最大值。表达式{m}匹配前导表达式所能匹配的字符连续m次出现的情况,表达式{m,}匹配至少连续m次出现的情况,表达式{m,n}匹配重复出现次数界于m与n之间的情况。例如,对于字符串abababccccccd,扩展c{3}正则表达式匹配第7-9个字符,表达式(ab){2,}匹配第1-6个字符。
复制符号(+,*,?)连续重复出现的情况未被定义。

l        ERE或操作

由特殊符号(|)连接的两个EREs匹配它们中任何一个ERE所能匹配的字符串。例如,表达式a((bc)|d)匹配字符串abc和字符串ad。

l        ERE优先级

ERE Precedence (from high to low)
collation-related bracket symbols
[= =] [: :] [. .]
escaped characters
\<special character>
bracket expression
[ ]
grouping
( )
single-character-ERE duplication
* + ? {m,n}
concatenation
 
anchoring
^ $
alternation
|

l        ERE锚定表达式

扩展正则表达式可有限的用于匹配某行开始或结尾的字符串,这被称为锚定。特殊字符抑扬符号与美元号只要在括号表达式之外都被视为锚。
抑扬符号在括号表达式外时,以抑扬字符开头的表达式与子表达式将仅从字符串的起始位置开始匹配。例如基本表达式^ab匹配字符串abcdef,而不能匹配字符串cdefab。表达式a^b是合法的,但不能匹配任何字符或字符串。
美元符号在括号表达式外时,以其结尾的扩展正则表达式与子表达式将仅从字符串的结尾位置开始匹配。例如表达式ef$与(ef$)匹配字符串abcdef中的ef字符,而不能匹配字符串cdefab。表达式e$f是合法的,但不能匹配任何字符或字符串。

阅读(2416) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~