字符转义
如何在目标字符串里面查找元字符呢?比如”.””*”,如果直接在正则表达式里面直接使用肯定是不行的。
正则表达式这里处理的办法和 一般编程语言处理方式相类似,直接使用\来取消它的元字符地位,于是,可以在元字符里面可以这样使用:”\.”或者”\*”。
查找未被预定义的字符
标题的意思是说,如果想要查找的字符没有相对应的元字符来处理怎么办?在正则表达式里面我们使用中括号[]来处理,你只要在中括号里面列举你想要查找的字符就可以了。例如查找0~9的数字和w字符:
分支条件
首先来看一个例子:
\(?0\d{2}[) -]?\d{8}
上面的(和)也是元字符,这里使用了\转义符,后面跟了?符号,所以表示的查找的就是有括号或者没有括号开头的字符串。分解如下:
\(? 0\d{2}[) -]? \d{8}
可以匹配类似于(010)88886666或022-22334455, 或02912345678等多种字符串。如果你想要查找电话号码的话,那就问题大了,因上面这个表达式还有可能匹配类似于010)12345678或(022-87654321这种字符串。
怎么解决上面的问题呢?
答案当然是给上述的正则表达式使用更加精准的限制条件。这里我们使用分支条件。
所谓分支条件是指:多种规则并列共同构成一个正则表达式,只要字符串匹配符合其中一个规则,就算找到一个字符串,多个规则之间使用|符号来分开。
以上面的例子来说明:\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}。
在使用分支条件的时候,要注意各个条件之间的顺序,因为正则表达式工作的时候是从左到右来匹配的,如果某个字符串符合第一条规则,就直接跳出了,不会再去管。例如可以比较试下\d{5}-\d{4}|\d{5}和\d{5}|\d{5}-\d{4}的区别。
分组
先来看两个例子:
\d{3}表示数字重复三次。
\w{4}表示匹配4位字符的单词(\w的意义表示0~9,A~Z,a~z等请看前章节)。
现在,提问:要是想指定HG这两个字符重复多次怎么办?或者其他任意指定的字符重复多次怎么办?
正则表达式里面使用 分组 来解决这个问题。
分组,或者叫做子表达式,在正则表达式里面使用小括号来指定,包含在小括号里面的字符就是一个分组,你可以对它们的重复次数做处理。小括号前面说过,也是元字符。
例如,匹配IP地址:
(\d{1,3}\.){3}\d{1,3}
可以这样分解:
(\d{1,3}\.){3} \d{1,3}
小括号里面的意思是1~3位数字外加一个点;小括号后面跟了个{3}表示子表达式必须重复3次。橙色的表示1~3位数字。
反义
前面已经提到了分组这个好东西,用着也还顺手,现在又有新的问题了,万一我想查找a~z,A~Z这52个字符怎么办?难道要将他们全部都写进子表达式么?有没有好的办法呢?这里使用到了反义。
联系前面学过的元字符,反义其实就是把他们的元字符大写。具体如下:
代码 | 详解 |
\W | 匹配任意不是字母,数字,下划线,汉字等等的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意不是数字的字符 |
\B | 匹配任意不是单词开头或者结尾的位置 |
[^X] | 匹配除了X以外的任意字符 |
[^aieou] | 匹配除了aieou几个字母以外的任意字符 |
例如:\S+表示不包含空白符的字符串(至少有一个字符)。