正则表达式精要

      正则表达式是人们为了高效快捷地搜索、替换特定信息而发明的一种工具,它由一些用来匹配和处理文本的字符串所构成。简单地说,正则表达式是用正则表达式创建的,其目的是解决需要用到搜索、替换的复杂问题,而这些问题用其他方式并不容易实现。正则表达式虽然算不上一种完备的程序设计语言,但是其也有需要去掌握的特殊语法和指令,能够掌握正则表达式,无疑会使我们在处理诸如文本编辑、信息提取等问题上真正做到游刃有余。确实,语法并不是正则表达式最难的地方,真正困难的是如何将实际问题具体到各种可能出现的细节,从而让正则表达式匹配精度尽可能地高。

      虽然不同的语言或程序正则表达式的用法可能会有所差异,但原理应当是一致的。

  (注:接下来的实例中,被匹配的内容将用红色标出,元字符用蓝色标出

 

1、匹配单个字符

1.1 匹配纯文本

      正则表达式包括纯文本,也可以只包含纯文本,只不过只是纯文本的话,就显得有点浪费了。

E.g.

文本:Here is bokeyuan.I am here.

正则表达式:here

结果 : Here is bokeyuan.I am here.

      可以看到,这里正则表达式here匹配到了here(红色的),也可以看到正则表达式是区分大小写的(不同语言或工具对于不区分字母大小写的匹配操作可能有不同的规则,需要自己查询)。简单说一下,匹配到了能干什么呢?因为正则表达式本身不是完备的语言,它需要配合其他语言或程序使用,于是你就可以在你使用的语言或程序的支持下进行你想要的操作了,如一个文件夹中某些文件名的查询、HTML中对网页布局的查询和修改等,可以做的事是非常多的。

总结:正则表达式由正则表达式语言所构造,它一般被用来完成复杂的搜索和替换操作,当然替换操作执行之前首先要进行搜索。

 

1.2 匹配任意字符

E.g.

文本:Here is bokeyuan.I am here.

正则表达式:.ere

结果 : Here is bokeyuan.I am here.

      可以看到,.here匹配到了Here和here,说明.字符既匹配到了H,有匹配到了h;因为.字符可以匹配任何除了换行符以外的任意单个字符、字母、数字以及.本身(在绝大多数正则表达式里)。

 

1.3 匹配特殊字符

      正则表达式里有很多特殊含义的字符(即这些字符在正则表达式里不具有本来的含义,而是正则表达式所规定的含义),如.字符本身含义就是一个.,但是在正则表达式里代表除了换行符以外的任意单个字符、字母、数字以及.本身的含义。但是你想要在正则表达式里使用这些特殊字符的本来含义应该怎么办呢?只需要在.前面加上一个反斜杠字符\进行转移即可;对,这里\字符便是转义字符,\.在正则表达式里代表.的意思。既然\在正则表达式代表转义的含义,那么\字符也是特殊字符了,这些特殊字符还有一个名字叫元字符(在正则表达式中,这个字符有特殊含义,而不是其本身含义)。

E.g.

文本:This is bokeyuan. The URL is www.boke.com.

正则表达式:boke\.

结果:This is bokeyuan. The URL is www.boke.com.

      可以看到,这里匹配到了boke.而没有匹配到bokey,因为\.在正则表达式就是代表.的意思。

总结:正则表达式是由一些字符构成的字符串,这些字符可以是普通字符或元字符(在正则表达式里有特殊含义的字符)。可以看到,在正则表达式里,有一些特殊字符在加了\之后才代表自身含义,但是含有更多的字符是加了\之后才有了特殊含义。

注:正则表达式中,.具有特殊含义,加\之后的\.仅代表字符.;n仅代表字符n,加\之后的\n具有了特殊含义,就是换行。所以,有些字符转义之前是元字符,有些字符转义之后是元字符,之后我们将看到更多的这种元字符(正则表达式中的特殊字符)。

 

 

2、匹配一组字符

2.1 匹配字符集合

    绝大多数情况,我们需要匹配一个取值受限的字符,如我们想要匹配一段文字中的四位数年份,那么我们可以知道该年份的第一位数一定是1或2,不可能是其他情况,那怎么表示1或2两种情况呢?正则表达式为我们提供了字符集合便是元字符[ 和 ],这两个元字符之间的所有字符都是该集合的组成部分,字符集合的匹配结果是能够与该集合里的任意一个成员相匹配的文本,如前面的[12]表示1或2。

E.g.

文本:I was born in 1996, and now I am 21.

正则表达式:[12][0-9][0-9][0-9]

结果:I was born in 1996, and now I am 21.

  这里,[0-9]与[0123456789]等价,为0到9之间的任意一个整数,可以看到这里使用了正则表达式用来表示字符区间的元字符 - 。

  在同一个字符集合里可以给出多个字符区间,如[a-z0-9A-Z]。

  再次强调,匹配时,往往需要根据自己的意图尽量增大匹配精度,这便是正则表达式的难点,因为好多时候我们无法将一些不符合情况的文本排除。

注:1、字符区间的首、尾字符可以是ASCII码的任意字符。

  2、- 作为元字符只能用在[ 和 ]之间,在字符集合以外的地方只是一个普通字符,所以,在正则表达式里 - 不需要被转义。

 

2.2 取非匹配

  某些场合,对于一个字符,取值的可能比较多,即我们只能排除一小部分字符,那么将可能的情况列举出来实在麻烦,好在人们在设计正则表达式的时候已经尽可能多的考虑了可能会遇到的问题,我们可以用正则表达式的元字符^来对一个字符集进行取非匹配

E.g.

文本:This is bokeyuan. The URL is www.boke.com.

正则表达式:.R[^0-9a-z]

结果:This is bokeyuan. The URL is www.boke.com.

  这里,.匹配一个非换行字符,R匹配字符R,[^0-9a-z]匹配除0-9和a-z以外的所有可能的字符中的一个。

注:^作用于给定字符集合里的所有字符和字符区间。

总结:元字符[ 和 ] 被用来定义一个字符集合,其含义是必须匹配区间里的字符之一。定义一个字符集合有两种方式:一是把所有的字符都列举出来;二是元字符-以更简便的字符区间的形式进行列举。字符集合可以用元字符^进行取非。

 

 

3、更多元字符

  前面已经使用了部分元字符,可以看到,正是由于元字符的存在,正则表达式才得以如此简洁高效。接下来我们将重述元字符的含义和介绍更多的元字符。

3.1 元字符与转义

  元字符是一些在正则表达式里有特殊含义的字符,如元字符 . 可以匹配任意一个除换行符以外的任意字符,元字符方括号 [ 表示一个字符集合的开始。

  因为元字符在正则表达式里已经具备了正则表达式所规定的特殊含义,所以这些字符就无法匹配他们自己,如 . 不只是匹配字符 . 。

E.g.

文本:String[] str = new String[]{"am","is","are"};String string = str[0];

正则表达式:str[0] 

结果:String[] str = new String[]{"am","is","are"};String string = str[0];

  可以发现,没有任何文本被匹配,因为str匹配文本str,[0]只能匹配0,所以str[0]只能匹配str0。于是我们想要匹配str[0]应该怎么办呢?我们在前面已经介绍过解决方法,在未经转义的元字符前加上反斜杠\对其进行转义,让其代表其自身的普通含义。

于是关于匹配str[0]的问题可以这样做:

E.g.

文本:String[] str = new String[]{"am","is","are"};String string = str[0];

正则表达式:str\[0\] 

结果:String[] str = new String[]{"am","is","are"};String string = str[0]

注:1、后面将会看到更多的字符是在转义之后才变为元字符的,而在转义前他们只是普通字符。

  2、事实上,任何一个元字符都可以通过给它加上一个反斜杠字符进行转义。

 

3.2 匹配空白字符

  元字符大致可以分为两种,一种是匹配文本的(如 . 和纯文本等),另一种是正则表达式的语法要求(如[ 和 ])。

  在进行匹配时,我们经常需要对原始文本里的非打印空白字符进行匹配的情况。如表3-1为空白元字符。

 

表3-1 空白元字符
元字符表示
[\b] 回退(并删除)一个字符(Backspace键)
\f 换页符
\n 换行符
\r 回车符
\t 制表符(Tab键)
\v 垂直制表符

 

 E.g.

文本:This is bokeyuan.

 

     The URL is www.boke.com.

正则表达式:\r\n\r\n

结果:This is bokeyuan.

     ----------------------------------------

     The URL is www.boke.com.

  此处匹配部分用----------表示,\r\n匹配一个回车+换行(许多操作系统把这个组合用作文本行结束的标志)。

 

3.3 匹配特定的字符类别 

3.3.1 元字符\d和\D

  数字元字符\d和非数字元字符\D如下表3-2所示:

 

表3-2 数字元字符
元字符表示
\d 任何一个数字字符(等价于[0-9])
\D 任何一个非数字字符(等价于[^0-9])

E.g.

文本:String[] str = new String[]{"am","is","are"};String string = str[0];

正则表达式:str\[\d\] 

结果:String[] str = new String[]{"am","is","are"};String string = str[0]

3.3.2 元字符\w和\W

  字母和数字元字符\w和非字母和数字元字符\W如下表3-3所示:

 

表3-3 字母数字元字符
元字符表示
\w 任何一个字母数字字符(大小写均可)或下划线字符(等价于[a-zA-Z0-9_])
\W 任何一个非字母数字字符或非下划线字符(等价于[^a-zA-Z0-9_])

E.g.

文本:Matlab2015a

   Matlab2015b

         Matlab2015

正则表达式:\w\w\w\w\w\w\d\d\d\d\w

结果:Matlab2015a

   Matlab2015b

         Matlab2015

  由于正则表达式的模式匹配机制,Matlab2015没有被匹配。

3.3.3 元字符\s和\S

  所有空白字符元字符\s和所有非空白字符元字符\S如下表3-4表示:

表3-4 空白字符元字符
元字符表示
\s 任何一个空白字符(等价于[\f\n\t\v])
\S 任何一个非空白字符(等价于[^\f\n\t\v])

注:用来匹配退格字符的\b元字符比较特殊,他不在\s的覆盖范围内。

E.g.

 E.g.

文本:This is bokeyuan.

 

     The URL is www.boke.com.

正则表达式:\s\s\s\s

结果:This is bokeyuan.

     ----------------------------------------

     The URL is www.boke.com.

 

注:许多正则表达式支持POSIX字符类

总结:我们可以看到正则表达式为我们提供了用来匹配一个字符集合或字符类的元字符,为我们使用正则表达式提供了极大的便利。

posted @ 2016-10-23 13:15  文歌  阅读(313)  评论(0编辑  收藏  举报