1.概述
- 概念:在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。正则表达式就是用来进行文本匹配的工具
2.元字符
- .:匹配除换行符以外的任意字符
- \w:匹配字母或数字或下划线
- \s:匹配任意的空白符(包括空格,制表符(Tab),换行符,中文全角空格等)
- \d:匹配数字
- \b:匹配单词的开始或结束
- ^:匹配字符串的开始
- $:匹配字符串的结束.note:^和$都匹配一个位置,比如一个网站要求账号为5~12位数字,则可以这样写正则表达式:
^\d{5,12}$
2.字符转义
如果你想查找元字符本身的话,比如说.和*,?等就可以使用转义字符。
- \\匹配\
- \.匹配.
- \*匹配*等等
3.限定符
限定符作用于前面的字符
- *:重复零次或更多次
- +:重复一次或更多次.例如\d+表示匹配1个或者更多个数字
- ?:重复零次或一次
- {n}:重复n次
- {n,}:重复n次或更多次最少n次
- {n,m}:重复n到m次
- {,m}:最多m次
4.字符类
- 由来:想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),则可以使用字符类。(像字符,数字,空白符这些字符集合已经定义好了元字符)
- 语法:使用方括号列出想要匹配的字符集合
[0-9]:匹配一个数字,和\d效果一样
[a-z0-9A-Z_]:等同于\w
[aeiou]:匹配任何一个元音字母
5.分支条件
- 分支条件:指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开
举例:
0\d{2}-\d{8}|0\d{3}-\d{7}:表示匹配一种是三位区号,8位本地号(如010-12345678);一种是4位区号,7位本地号(0376-2233445)。
6.分组
- 由来:前面提到使用限定符如何重复单个字符,现在想重复多个字符就可以使用分组(用小括号指定子表达式)的方式,然后指定这个子表达式的重复次数。
- 例如:
(\d{1,3}\.){3}\d{1,3}
是一个简单的IP地址匹配表达式
7.反义
有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义。
1.常用的反义代码
- \W:匹配任意不是字母,数字,下划线的字符
- \D:匹配任意非数字的字符
- \S:匹配任意不是空白符的字符
- \B:匹配不是单词开头或结束的位置
- [^x]:匹配除了x以外的任意字符
- [^aeiou]:匹配除了aeiou这几个字母以外的任意字符
示例:
1. \S+匹配不包含空白符的字符串。
2. <a[^>]+>匹配用尖括号括起来的以a开头的字符串。
8.贪婪匹配与惰性匹配
1.贪婪匹配
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。比如说:a.*b,会匹配整个字符串aabab,而不是aab
2.惰性匹配
惰性匹配就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。 这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。比如说:a.*?b
表示匹配最短的,以a开始,以b结束的字符串.则结果是aab,ab都符合。
常用的懒惰限定符如下:
- *? 重复任意次,但尽可能少重复
- +? 重复1次或更多次,但尽可能少重复
- ?? 重复0次或1次,但尽可能少重复
- {n,m}? 重复n到m次,但尽可能少重复
- {n,}? 重复n次以上,但尽可能少重复