正则表达式
元字符
.:匹配任意字符除(换行符)
[]:匹配方括号中包含的任意字符(非顺序匹配)
[^]:否定字符,匹配方括号中不包含的字符
*:匹配前面的子表达式零次或多次
+:匹配前面的子表达式一次或多次
?:匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
{n,m}:匹配字符至少n次,但不超过m次
(xyz):字符组,按照确切的顺序匹配字符
|:类似于逻辑运算符“或”,匹配前面的字符或后面的字符
\:转义符
^:匹配行的开始
$:匹配行的结束
举例:
is[.]:并不是is后面跟任意的一个字符,而代表is.
星号“*”表示匹配上一个匹配规则零次或多次。正则表达式“a*“表示小写字母”a”可以重复零次或者多次。但是它如果出现在字符集或者字符类之后,它表示整个字符集的重复。 例如正则表达式”[a-z]*”,表示:一行中可以包含任意数量的小写字母。
"[a-z]*" => The car parked in the garage #21
is.+d:表示is后面可以跟任意数量的字符在加上d
[a-z]{3,4}:表示匹配a-z中任意字符,长度最少为3,但不超过4,:aaaaaaa:匹配到2个,前面4个a,和后面的三个a
{2,}:匹配2个或2个以上。 {2}:匹配2个。
字符组:
(i|s|h)le:匹配ile或sle或hle
(I|i)le|nm总共四种匹配:Ile ile inm Inm
(f|c|m)at\.? 总共六种匹配:fat. cat. mat. fat cat mat
^(i|s)le:表示起始字符为i或者为s
简写 | 描述 |
. | 匹配除换行符以外的任意字符 |
\w | 匹配所有字母和数字的字符:[a-zA-Z0-9_] |
\W | 匹配非字母和数字的字符:[^\w] |
\d | 匹配数字:[0-9] |
\D | 匹配非数字:[^\d] |
\s | 匹配空格符:[\t\n\f\r\p{Z}] |
\S | 匹配非空格符:[^\s] |
符号 | 描述 |
?= | 正向先行断言 使用规则(?=...) |
?! | 负向先行断言 使用规则(?!…) |
?<= | 正向后行断言 使用规则(?<=…) |
?<! | 负向后行断言 使用规则(?<!…) |
正向先行断言:(T|t)he(?=\sfat)
,表示:匹配大写字母T
或小写字母t
,后面跟字母h
,后跟字母e
。 在括号中,我们定义了正向先行断言,它会引导正则表达式引擎匹配后面跟着fat
的The
或the
"(T|t)he(?=\sfat)" => The fat cat sat on the mat;匹配到了fat前面的空格符和The
负向先行断言:(T|t)he(?!\sfat)
,表示:从输入字符串中获取全部The
或者the
且不匹配fat
前面加上一个空格字符。
"(T|t)he(?!\sfat)" => The fat cat sat on the mat;fat前面的空格符和The或the没有匹配
正向后行断言:(?<=(T|t)he\s)(fat|mat)
"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.
(?<!(T|t)he\s)(cat)
,表示:在输入字符中获取所有不在The
或the
之后的所有单词cat
。
"(?<!(T|t)he\s)(cat)" => The cat sat on cat.
标记
标记也称为修饰符,因为它会修改正则表达式的输出。这些标志可以以任意顺序或组合使用,并且是正则表达式的一部分。
标记 | 描述 |
i | 不区分大小写:将匹配设置为不区分大小写。 |
g | 全局搜索:搜索整个输入字符串中的所有匹配。 |
m | 多行匹配:会匹配输入字符串每一行。 |
例:
I举例:/The/gi" => The fat cat sat on the mat 不区分大小写的匹配并且开启了全局搜索
g
举例:g
修饰符用于执行全局匹配(会查找所有匹配,不会在查找到第一个匹配时就停止)。例如正则表达式/.(at)/g
,表示:除换行符之外的任意字符,后跟小写字母a
,后跟小写字母t
。 因为我们在正则表达式的末尾使用了g
标记,它会从整个输入字符串中找到每个匹配项。
".(at)" => The fat cat sat on the mat. 只匹配到了第一个字符串
"/.(at)/g" => The fat cat sat on the mat. 开启全局搜索匹配到了四个字符串
/.at(.)?$/gm,表示:小写字母a,后跟小写字母t,匹配除了换行符以外任意字符零次或一次。而且因为m标记,现在正则表达式引擎匹配字符串中每一行的末尾。
"/.at(.)?$/gm" => The fat
cat sat
on the mat.
常用正则表达式:
正整数:^\d+$
负整数:^-\d+$
电话号码:^+?[\d\s]{3,}$
整数:^-?\d+$
用户名:^[\w\d_.]{4,16}$
字母数字字符:^[a-zA-Z0-9]*$
带空格的字母数字字符:^[a-zA-Z0-9 ]*$
密码:^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$
电子邮件:^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})*$
IPv4 地址^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*$
小写字母:^([a-z])*$
大写字母:^([A-Z])*$
网址:^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$
日期(MM/DD/YYYY):^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$
日期(YYYY/MM/DD):^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$
正则引擎分为两种
DFA:从起始状态开始,一个字符一个字符输入串,并根据正则来一步步确定至下一个转移状态,直到匹配不上或走完整个输入
NFA:从起始状态,一个字符一个字符地读取输入串,并与正则表达式进行匹配,如果匹配不上,则进行回溯,尝试其他状态(可利用回溯绕过某些安全限制)
练习:
利用断言实现密码限制,必须出现大小写字母,字符,数字总共16位,首字母大写
^(?:(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[^A-Za-z0-9])).{16}$
成功匹配