正则学习
1.字符介绍
- ^: 匹配起始位置 例如: ^ttt 即匹配以ttt 开头的字符串
- $: 匹配字符串结尾 例如: $ttt 即匹配以ttt 结尾的字符串
- \b: 匹配单词,例如 \bis\b 即匹配单词is
- \d: 匹配数字, 例如 匹配一个三个数字开头的字符串可以写成 ^\d\d\d
- \w: 匹配字母,数字,下划线,例如我要匹配一个字符串为 dwqdn61_dwq 则正则表达式为 \w+
- \s: 匹配空格, 例如字符串为 ‘a b c’,则正则表达式为 ‘\w\s\w\s\w’一个字符后跟一个空格,如果要匹配多个空格,则为\s+
- .: 匹配除了换行符以外的任意字符
- [pdwp]: 字符组,匹配包含括号中元素的字符串例如[a-z] 只能匹配小些字符
2.几种反义
写法很简单,即小写字母改成大写字母
- \W: 匹配任意部位字母,数字,下划线
- \S: 匹配不是空白符的字符
- \D: 匹配任意非数字的字符
- \B: 匹配不是单词开头或结束的位置
- [^abc]: 匹配除了abc以外的字符
3.量词
- (贪婪):匹配0次或者多次,如a\则匹配0个a或者多个a
- +(懒惰):匹配1次或者多次,如a+则匹配1个a或者多个a
- ?(占有):匹配0次或者1次,如a?则匹配0个或者1个a
- {n}: 匹配n个字符,如a{3}则匹配3个a
- {n,m}: 匹配n到m个字符,如a{3,4}则匹配3个a或者4个a
- {n,}: 匹配最少n个字符,如a{3,}则匹配最少3个a
注意: 以上的量词都只是匹配最靠近的字符,即如果正则表达式为 ‘ab*‘ 即匹配的是字符串是a后面的b为0个或者多个,而不是ab的个数为0个或者多个。能匹配的字符串是a,ab,abb,而不是abab之类,如果要匹配以ab为单位则正则可以写成(ab)+
4.正则进阶
- 捕获分组
- 概念:在一个括号中的内容如(\d)\d,前面(\d)就是一个捕获分组,可以对捕获分组进行后向引用,即我在后面的正则中可以使用前面的捕获分组。例如(\d)\d\1这里的\1就是对(\d)的后向引用。
- 常用用法:
- (exp):匹配exp,并自动捕获文本到自命名空间
- (?
exp): 匹配exp,并捕获文本到名称为name的空间,使用时为\k - (?:exp): 匹配exp,不捕获匹配的文本,也不给该分组分配组号
- (?=exp): 匹配exp前面的位置,如’What are you’,该正则为(?
.+(?=you))这里取you前面的所有字符成一个分组,该分组名为txt,内容为’What are ‘ - (?<=exp): 匹配exp后面的位置,如’What are you’,该正则为(?
(?<=How).+)这里取How后面的所有字符成一个分组,该分组名为txt,内容为’ are you’ - (?!exp): 匹配后面跟的不是exp的位置,如’123abc’,正则(\d{3}(?!\d)),匹配三个数字后面非数字的结果
- (?<!exp): 匹配前面不是exp的位置,如’abc123’,正则为(?<!\d)\d{3},匹配前面的3个非数字的集合
注意: 这里的捕获分组,捕获的是第一次匹配的文本,而不是正则表达式,例如:13[1-9]-(\d{4})-\1,字符串是:131-5200-1230,这里捕获的是5200这个文本,而不是\d{4}这个表达式,所以这个字符串和正则不匹配
5.正则实战
- 匹配Email地址
- 分析:email地址由一排数字,字母,或下划线组成+@+字母+.com组成
- 编写:^\w+@\w+.com$
- 匹配131到139开头的电话号码
- 分析:手机号由11位数字组成
- 编写:^13[1-9]-\d{4}-\d{4}$
- 匹配QQ号
- 分析:QQ由最少5位组成,除了第一位不为0
- 编写:[1-9]\d{4,}