1.概述

  1. 概念:在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。正则表达式就是用来进行文本匹配的工具

2.元字符

  1. .:匹配除换行符以外的任意字符
  2. \w:匹配字母或数字或下划线
  3. \s:匹配任意的空白符(包括空格,制表符(Tab),换行符,中文全角空格等)
  4. \d:匹配数字
  5. \b:匹配单词的开始或结束
  6. ^:匹配字符串的开始
  7. $:匹配字符串的结束.note:^和$都匹配一个位置,比如一个网站要求账号为5~12位数字,则可以这样写正则表达式:^\d{5,12}$

2.字符转义

如果你想查找元字符本身的话,比如说.和*,?等就可以使用转义字符。

  1. \\匹配\
  2. \.匹配.
  3. \*匹配*等等

3.限定符

限定符作用于前面的字符

  1. *:重复零次或更多次
  2. +:重复一次或更多次.例如\d+表示匹配1个或者更多个数字
  3. ?:重复零次或一次
  4. {n}:重复n次
  5. {n,}:重复n次或更多次最少n次
  6. {n,m}:重复n到m次
  7. {,m}:最多m次

4.字符类

  1. 由来:想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),则可以使用字符类。(像字符,数字,空白符这些字符集合已经定义好了元字符)
  2. 语法:使用方括号列出想要匹配的字符集合
[0-9]:匹配一个数字,和\d效果一样
[a-z0-9A-Z_]:等同于\w
[aeiou]:匹配任何一个元音字母

5.分支条件

  1. 分支条件:指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开
举例:
0\d{2}-\d{8}|0\d{3}-\d{7}:表示匹配一种是三位区号,8位本地号(如010-12345678);一种是4位区号,7位本地号(0376-2233445)。

6.分组

  1. 由来:前面提到使用限定符如何重复单个字符,现在想重复多个字符就可以使用分组(用小括号指定子表达式)的方式,然后指定这个子表达式的重复次数。
  2. 例如:(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式

7.反义

有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义。

1.常用的反义代码
  1. \W:匹配任意不是字母,数字,下划线的字符
  2. \D:匹配任意非数字的字符
  3. \S:匹配任意不是空白符的字符
  4. \B:匹配不是单词开头或结束的位置
  5. [^x]:匹配除了x以外的任意字符
  6. [^aeiou]:匹配除了aeiou这几个字母以外的任意字符
    示例:
1. \S+匹配不包含空白符的字符串。
2. <a[^>]+>匹配用尖括号括起来的以a开头的字符串。

8.贪婪匹配与惰性匹配

1.贪婪匹配

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。比如说:a.*b,会匹配整个字符串aabab,而不是aab

2.惰性匹配

惰性匹配就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。 这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。比如说:a.*?b表示匹配最短的,以a开始,以b结束的字符串.则结果是aab,ab都符合。
常用的懒惰限定符如下:

  1. *? 重复任意次,但尽可能少重复
  2. +? 重复1次或更多次,但尽可能少重复
  3. ?? 重复0次或1次,但尽可能少重复
  4. {n,m}? 重复n到m次,但尽可能少重复
  5. {n,}? 重复n次以上,但尽可能少重复