正则表达式必知必会(一)

来源:互联网 发布:可延迟服务器调度算法 编辑:程序博客网 时间:2024/06/06 00:39

正则表达式是被用来匹配字符串中的字符组合的模式。

匹配单个字符

匹配纯文本

正则表达式可以包含纯文本,并且可以只包含纯文本。
Ben就是一个简单的纯文本正则表达式。它将匹配文本中的Ben。

有多个匹配结果

绝大多数正则表达式引擎的默认行为是只返回第一个匹配结果。
而若想得到所有匹配结果,就需要做一些配置。
在JavaScript中就是指定g标志,表示将返回一个包含所有匹配的结果数组。

大小写问题

正则表达式是区分大小写的,但绝大多数正则表达式也能实现不区分大小写的匹配操作。
在JavaScript中指定i标志,来强制执行一次不区分大小写的搜索。

匹配任意字符

. 字符可以匹配任何一个单个的字符。
比如,正则表达式c.t将匹配到cat,cot等单词。

正则表达式匹配的并不总是整个字符串,而是匹配某个满足模式的字符串,及时它只是整个字符串的一部分。
因此在上面的例子中,c.t也能匹配cat11这样的字符串。

.字符可以匹配任何单个的字符、字母、数字甚至是.本身。
比如,正则表达式sales.可以匹配sales. sales1 sales2 salesw这些字符串。

同一个正则表达式中允许使用多个.字符,他们既可以连续出现(比如,..将匹配任意两个字符),也可以间隔着出现在模式的不同位置。

匹配特殊字符

.在正则表达式里有特殊的含义,如果模式里需要一个.,那么要想办法来告诉正则表达式我们需要的是.字符本身而不是它在正则表达式中的特殊含义。
为此,必须在.前面加上一个\(反斜杠)来对它进行转义。

\是元字符,表示这个字符有特殊含义

比如,使用.a.\.进行匹配,可以得到na1. 或 sa2. 这样的结果,但是nank这样的字符是不会被匹配上的。

在正则表达式中,\字符永远出现在一个有着特殊含义的字符序列开头,这个序列可以由一个或多个字符组成。

如果需要搜索\本身,那么也要对\进行转义,相应的转义序列就是\\

匹配一组字符

与匹配单个字符不同,字符集和则能够匹配特定的字符和字符区间。

匹配多个字符中的某一个

比如说我们想使用.a来匹配na和sa,但是不想匹配ca等其他的字符串。这时就可以使用元字符[]来定义一个字符集合。

在使用[]定义的字符集合里,这两个元字符之间的所有字符都是该集合的组成部分,字符集合的匹配结果是能够与该集合里的任意一个成员相匹配的文本。

比如,正则表达式[ns]a.\.就可以匹配到na1.或 sa9.这样的字符。[ns]这个集合将只匹配字符n或s。

字符集合在不需要区分大小写的搜索操作中比较常见。如表达式[Rr]eg[Ee]x既能匹配RegEx,也能匹配全小写的regex。
这种技巧适合在全局需要区分大小写但在某个局部不需要区分大小写的搜索中。

利用字符集合区间

比如我们想在某个位置只匹配数字,那么我们可以这么写:

[ns]a[0123456789]\.

这样就只会匹配na1.这样的字符串,而sab.则不会被匹配。

像这样总是会频繁地用到一些字符区间(0~9,A~Z等)。为了简化字符区间的定义,正则表达式提供了一个特殊的元字符:字符区间可以用-(连字符)来定义。

这样的话我们可以改写刚才的正则表达式:

[ns]a[0-9]\.

[0-9]与[0123456789]完全等价。

字符区间不仅限于数字,以下这些都是合法的字符区间:

  • A-Z:匹配所有A到Z的大写字母
  • a-z:匹配所有a到z的小写字母
  • A-F:匹配从A到F的大写字母
  • A-z:匹配从ASCII字符A到ASCII字符z的所有字母。这个模式一般不常用,因为它还包含着[和^等在ASCII字符表里排列在Z和a之间的字符。

字符区间的首尾字符可以是ASCII字符表里的任意字符。但在实际工作中,最常用的还是数字字符区间和字母字符区间。

定义某个字符区间的时候,一定避免让这个区间的尾字符小于首字符,比如[3,1],这种区间是没有意义的,而且往往会让整个模式失效。

-

-(连字符)是一个特殊的元字符,作为元字符它只能用在 [ 和 ] 之间。在字符集合以外的地方,它只是一个普通字符,只能与-本身相匹配。
因此在正则表达式里,-不需要被转义

在同一个字符集合里可以给出多个字符区间。比如下面这个模式:

[A-Za-z0-9]

可以匹配任何一个字母(无论大小写)或数字,但除此之外其他字符(既不是字母又不是数字)都不匹配。

再看另一个例子,比如这次我们要匹配RGB值(一个六位十六进制数字给出的三基色的组合值)。并且RGB中的字母是不区分大小写的,那么下面这个表达式就能够匹配所有RGB值

#[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]

这将匹配一个由字符#开头,然后是六个数字或字母a-f(大小写均可)的字符串。

#336633#ffffff 都能被匹配。

取非匹配

字符集合通常用来指定一组必须匹配其中之一的字符。但在某些场合我们需要反过来做,给出一组不需要得到的字符。换句话说,除了那个字符集合里的字符,其他字符都可以匹配。

元字符^用于表明你想对一个字符集合进行取非匹配。

例如,表达式[ns]a[^0-9]将匹配第三个字符不是数字的一些字符串,如naw,sar等,像na1是不会被匹配的。

^的效果将作用于给定字符集合里的所有字符或字符区间,而不是仅限于紧跟在^后面的那一个字符或字符区间。

使用元字符

对特殊字符进行转义

元字符是一些在正则表达式里有特殊含义的字符。而正是因为其特殊含义,所以这些字符就无法代表它们本身。
比如不能用 [ 来匹配 [ 本身,也不能使用 . 来匹配 . 本身。
如果我们想匹配js代码中的一个数组array[0],如果使用表达式array[0],那么只能匹配到array0,因为[0]代表的是一个字符集合,而这个集合中只有一个0。

正如前面讲到的,在元字符前面加上一个反斜杠\来对元字符进行转义,就可以匹配其本身所代表的的字符。
更改一下前面的正则表达式:

array\[0\]

这样就可以匹配到array[0]这个字符串了。
如果不光想匹配array[0],还想匹配array[1],array[2]等,那么可以写成如下形式:

array\[[0-9]\]

\本身也是一个元字符,因此需要匹配\本身的时候,我们必须把它转义成\\

匹配空白字符

元字符大致可以分为两种,一种是用来匹配文本的,如.,一种则是正则的语法要求的,比如[]。下面介绍一个用于匹配空白字符的元字符。

我们经常会遇到需要对原始文本里的非打印空白字符进行匹配的情况。比如我们可能需要把制表符或者换行符找出来,我们可以使用如下元字符来进行匹配:

  • [\b]:回退并删除一个字符(Backspace键)
  • \f:换页符
  • \n:换行符
  • \r:回车符
  • \t:制表符(Tab键)
  • \v:垂直制表符

比如,\r\n是一个回车+换行的组合,许多操作系统都把这个组合作为文本行的结束标签。使用\r\n\r\n就可以匹配两个连续的行尾标签,也就是两条记录之间的空白行。

上面的f,n,r等被转义之后变成了元字符。如果没有用\对他们进行转义,那么它们就被解释为普通字符,只能匹配它们自身。

匹配特定的字符类别

前面讲过的字符集合是最常见的匹配形式,而一些常用的字符集合也可以用特殊元字符来代替。这些元字符匹配的是某一类别的字符(即字符类),用它们构造出来的正则表达式简明易懂,在实践中很有用。

匹配数字(与非数字)

之前讲过,[0-9]是[0123456789]的简写形式,可以用来匹配任何一个数字。
而如果想匹配数字以外的其他东西,那么就写成[^0-9]就可以了。
但是,有类元字符可以用来匹配数字和非数字:

  • \d:任何一个数字字符,等价于[0-9]
  • \D:任何一个非数字字符,等价于[^0-9]

比如,array\[\d\]就和前面写过的array\[[0-9]\]作用相同,用于匹配array[0],array[1],array[2]等。

可以看出,对于同一匹配结果,正则表达式可以有多种解决方法,选择最熟悉的语法即可。

-

正则表达式的语法是区分大小写字母的。\d匹配数字,而\D则正好相反。

匹配字母和数字(与非字母和数字)

字母和数字,再加上下划线,是一种比较常用的字符集合。

  • \w:任何一个字母(不区分大小写)、数字或下划线,等价于[a-zA-z0-9_]
  • \W:任何一个非字母、非数字、非下划线字符,等价于[^a-zA-z0-9_]

比如,\w\d\w\d\w\d,其形式是字母数字与纯数字交替出现的形式。如112233,H1E3K4。

匹配空白字符(与非空白字符)

另一种常见的字符类别是空白字符。在前面有介绍一些匹配空白字符的元字符。而下面是用来匹配所有空白字符的类元字符:

  • \s:任何一个空白字符,等价于[\f\n\r\t\v]
  • \S:任何一个非空白字符,等价于[^\f\n\r\t\v]

用来匹配退格符的[\b]是一个特例,他不在类元字符\s的覆盖范围内,也没有被排除在类元字符\S的覆盖范围外。

匹配十六进制或八进制数值

使用十六进制值

在正则表达式里,十六进制数值要用前缀\x来给出。
比如,\x0A对应于ASCII字符10,其效果等价于\n

使用八进制值

在正则表达式里,八进制数值要用前缀\0来给出。
数值本身可以是两位或三位数字。
比如,\011对应ASCII字符9(制表符),其效果等价于\t

0 0
原创粉丝点击