• 字符转义

如何在目标字符串里面查找元字符呢?比如”.””*”,如果直接在正则表达式里面直接使用肯定是不行的。

正则表达式这里处理的办法和 一般编程语言处理方式相类似,直接使用\来取消它的元字符地位,于是,可以在元字符里面可以这样使用:”\.”或者”\*”

  • 查找未被预定义的字符

标题的意思是说,如果想要查找的字符没有相对应的元字符来处理怎么办?在正则表达式里面我们使用中括号[]来处理,你只要在中括号里面列举你想要查找的字符就可以了。例如查找0~9的数字和w字符:

正则表达式学习笔记(二)_正则表达式

  • 分支条件

首先来看一个例子:

         \(?0\d{2}[) -]?\d{8}

上面的()也是元字符,这里使用了\转义符,后面跟了?符号,所以表示的查找的就是有括号或者没有括号开头的字符串。分解如下:

         \(? 0\d{2}[) -]? \d{8}

可以匹配类似于(010)88886666022-22334455 02912345678等多种字符串。如果你想要查找电话号码的话,那就问题大了,因上面这个表达式还有可能匹配类似于010)12345678(022-87654321这种字符串。

         怎么解决上面的问题呢?

         答案当然是给上述的正则表达式使用更加精准的限制条件。这里我们使用分支条件。

         所谓分支条件是指:多种规则并列共同构成一个正则表达式,只要字符串匹配符合其中一个规则,就算找到一个字符串,多个规则之间使用|符号来分开。

以上面的例子来说明:\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}

正则表达式学习笔记(二)_正则表达式_02

在使用分支条件的时候,要注意各个条件之间的顺序,因为正则表达式工作的时候是从左到右来匹配的,如果某个字符串符合第一条规则,就直接跳出了,不会再去管。例如可以比较试下\d{5}-\d{4}|\d{5}\d{5}|\d{5}-\d{4}的区别。

  • 分组

先来看两个例子:

         \d{3}表示数字重复三次。

         \w{4}表示匹配4位字符的单词(\w的意义表示0~9A~Za~z等请看前章节)。

现在,提问:要是想指定HG这两个字符重复多次怎么办?或者其他任意指定的字符重复多次怎么办?

正则表达式里面使用 分组 来解决这个问题。

分组,或者叫做子表达式,在正则表达式里面使用小括号来指定,包含在小括号里面的字符就是一个分组,你可以对它们的重复次数做处理。小括号前面说过,也是元字符。

例如,匹配IP地址:

         (\d{1,3}\.){3}\d{1,3}

可以这样分解:

         (\d{1,3}\.){3} \d{1,3}

小括号里面的意思是1~3位数字外加一个点;小括号后面跟了个{3}表示子表达式必须重复3次。橙色的表示1~3位数字。

正则表达式学习笔记(二)_正则表达式_03

  • 反义

前面已经提到了分组这个好东西,用着也还顺手,现在又有新的问题了,万一我想查找a~z,A~Z52个字符怎么办?难道要将他们全部都写进子表达式么?有没有好的办法呢?这里使用到了反义。

         联系前面学过的元字符,反义其实就是把他们的元字符大写。具体如下:

代码

详解

\W

匹配任意不是字母,数字,下划线,汉字等等的字符

\S

匹配任意不是空白符的字符

\D

匹配任意不是数字的字符

\B

匹配任意不是单词开头或者结尾的位置

[^X]

匹配除了X以外的任意字符

[^aieou]

匹配除了aieou几个字母以外的任意字符

例如:\S+表示不包含空白符的字符串(至少有一个字符)。