正则表达式

平时需要用到比较少,但是一到关键时刻却又需要,老是忘记。写个备忘

元字符

常用元字符表:

字符说明

.

匹配除换行符以外的任意字符

\w

匹配字母、数字、汉字、下划线

\s

匹配任意空白符

\d

匹配数字

\b

匹配单词的开头或结尾

^

匹配字符串的开头

$

匹配字符串的结尾

字符转义

如果要查找元字符本身,必须使用\来消除元字符的特殊意义。eg:c:\\windows匹配c:\windows

反义

字符说明

\W

匹配字母、数字、汉字、下划线以外的任意字符

\S

匹配任意不是空白的字符

\D

匹配任意不是数字的字符

\B

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

[^x]

匹配除x以外的任意字符

[^aieou]

匹配除aieou以外的任意字符

重复

字符说明

*

重复0或多次

+

重复1或多次

?重复0或1次

{n}

重复n次

{n,}

重复n到多次

{n,m}

重复n到m次

eg:[a-z]*:匹配任意长度的小写字母串aa,ab,ac

分支条件

有几种规则,当满足其中任意一种规则时都可成功匹配,规则用|隔开

eg:0\d{2}-\d{8}|0\d{3}-\d{7}:匹配两种号码:1)三位区号+八位号码2)四位区号+七位号码

分组

用小括号()来指定分组,默认分组号从1开始

eg:(24[0-5]|25[0-4]|[01]?\d\d?\.){3}(24[0-5]|25[0-4]|[01]?\d\d?):匹配ip地址

常用分组语法:

符号说明

(exp)

匹配exp,并捕获文本到自动命名的分组

(?<name>exp)

匹配exp,捕获文本到命名为name的分组

(:exp)

匹配exp,不捕获文本,也不分配组号

零宽断言

符号

说明

(?=exp)

匹配exp前面的位置

(?<=exp)

匹配exp后面的位置

(?!=exp)

匹配后面跟的不是exp的位置

(?<!exp)

匹配前面跟的不是exp的位置

eg:

1)\b\w+(?=ing\b)iamsinggingwhilesheisdancing匹配sing和danc

2)(\b?<=re)\w+\breadingabook匹配ading

贪婪和懒惰

字符说明

*?

重复任意次,但尽可能少重复

+?

重复1或多次,但尽可能少重复

??

重复0或1次,但尽可能少重复

{n,m}?

重复n到m次,但尽可能少重复

{n,}?

重复n到多次,但尽可能少重复