【笔记】正则表达式

前言

正则表达式,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。维基百科

修饰符(Flag)

  • 用于定义匹配的方式
修饰符 备注
i ignore,忽略大小写
g global,全局匹配
m multiple,匹配多行
s single,匹配单行
y sticky,粘性匹配

模式(Pattern)

字符类(Character Class)

  • 描述一组字符集合的简写
字符类 备注
. 匹配任意字符
\d 匹配数字0~9,相当于[0-9]
\D 匹配非数字0~9,相当于[^0-9]
\s 匹配空白字符(空格、制表符\t、换行符\n、回车符\r、垂直制表符\v、换页符\f
\S 匹配非空白字符
\w 匹配大写英文AZ、小写英文az、数字0~9、下划线_,相当于[A-Za-z0-9_]
\W 匹配非大写英文AZ、小写英文az、数字0~9、下划线_,相当于[^A-Za-z0-9_]

锚点(Anchor)

  • 规定开始位置和结束位置的匹配要求
锚点 备注
^ 开始锚点
$ 结束锚点

转义字符(Escape Character)

  • 描述具有特殊含义的字符
转义字符 备注
\[ 左方括号
\] 右方括号
\/ 正斜线
\\ 反斜线
\^ 脱字符
\$ 美元符
\.
\| 竖线
\? 问号
\* 星号
\+ 加号
( 左圆括号
) 右圆括号

边界匹配(Boundary Matching)

  • 描述由空格包裹的字符边界
边界 备注
\b 单词边界
\B 非单词边界

集合(Character Set)

  • 描述一个序列中的任意字符

abc中的任意一个可以被正确匹配

1
[abc]

范围(Character Range)

  • 描述一个范围内的任意字符

ac中的任意一个可以被正确匹配

1
[a-c]

量词(Quantifier)

  • 描述前一个字符出现的次数
量词 备注
+ 一个或多个,相当于{1,}
? 零个或一个,相当于{0,1}
* 零个或多个,相当于{0,}

确切的位数

只能出现1次

1
{1}

范围

最少出现1次,最大出现3次

1
{1,3}

最少出现1次,不限制最大次数

1
{1,}

最少出现1次,最大次出现3次

1
{,3}

贪婪模式和惰性模式

贪婪模式
  • 最后一次遇到匹配结果才会完成匹配
1
《.+》
input
1
《1》《2》
output
1
《1》《2》
惰性模式
  • 第一次遇到匹配结果就会完成匹配
1
《.+?》
input
1
《1》《2》
output
1
《1》

捕获组(Capturing Group)

  • 将数据分组,提取匹配结果
1
《(.+?)》
input
1
《1》
output
1
2
《1》
1

为捕获组定义组名

  • 通过?<>定义组名
1
《(?<key>.+?)》

为捕获组定义量词

ab出现2次

1
(ab){2}
input
1
ababb
output
1
abab

捕获组中的逻辑或

ab出现2次

1
(a|b){2}
input
1
ab
output
1
ab

捕获组中的逻辑非

a出现2次

1
(?:a){2}
input
1
abc
output
1
bc

常用的正则表达式

校验数字的表达式

数字

1
^[0-9]*$

n位的数字

1
^\d{n}$

至少n位的数字

1
^\d{n,}$

m~n位的数字

1
^\d{m,n}$

0和非0开头的数字

1
^(0|[1-9][0-9]*)$

非0开头的最多带两位小数的数字

1
^([1-9][0-9]*)+(.[0-9]{1,2})?$

带1~2位小数的正数或负数

1
^(\-)?\d+(\.\d{1,2})?$

正数、负数、小数

1
^(\-|\+)?\d+(\.\d+)?$

有两位小数的正实数

1
^[0-9]+(.[0-9]{2})?$

有1~3位小数的正实数

1
^[0-9]+(.[0-9]{1,3})?$

非0的正整数

1
2
3
^[1-9]\d*$
^([1-9][0-9]*){1,3}$
^\+?[1-9][0-9]*$

非0的负整数

1
2
^\-[1-9][]0-9"*$
^-[1-9]\d*$

非负整数

1
2
^\d+$
^[1-9]\d*|0$

非正整数

1
2
^-[1-9]\d*|0$
^((-\d+)|(0+))$

非负浮点数

1
2
^\d+(\.\d+)?$
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

非正浮点数

1
2
^((-\d+(\.\d+)?)|(0+(\.0+)?))$
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$

正浮点数

1
2
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$
^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

负浮点数

1
2
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$
^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$

浮点数

1
2
^(-?\d+)(\.\d+)?$
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

校验字符的表达式

汉字

1
^[\u4e00-\u9fa5]{0,}$

英文和数字

1
2
^[A-Za-z0-9]+$
^[A-Za-z0-9]{4,40}$

长度为3~20的所有字符

1
^.{3,20}$

由26个英文字母组成的字符串

1
^[A-Za-z]+$

由26个大写英文字母组成的字符串

1
^[A-Z]+$

由26个小写英文字母组成的字符串

1
^[a-z]+$

由数字和26个英文字母组成的字符串

1
^[A-Za-z0-9]+$

由数字、26个英文字母或者下划线组成的字符串

1
2
^\w+$
^\w{3,20}$

中文、英文、数字、下划线

1
^[\u4E00-\u9FA5A-Za-z0-9_]+$

中文、英文、数字,不包括下划线等符号

1
2
^[\u4E00-\u9FA5A-Za-z0-9]+$
^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$

可以输入含有^%&’,;=?$"等字符

1
[^%&',;=?$\x22]+

禁止输入含有~的字符

1
[^~\x22]+

特殊需求表达式

Email地址

1
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

域名

1
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?

InternetURL

1
2
^[a-zA-z]+://[^\s]*&
^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

手机号码

1
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$

电话号码

1
^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$

国内电话号码

1
^\d{3}-\d{8}|\d{4}-\d{7}$

身份证号

1
^\d{15}|\d{18}$

短身份证号码

1
2
^([0-9]){7,18}(x|X)?$
^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$

帐号是否合法

1
^[a-zA-Z][a-zA-Z0-9_]{4,15}$

密码

1
^[a-zA-Z]\w{5,17}$

强密码

1
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$

日期格式

1
^\d{4}-\d{1,2}-\d{1,2}

一年的12个月

1
2
^(0?[1-9]|1[0-2])$
>=1 && <=12

一个月的31天

1
^((0?[1-9])|((1|2)[0-9])|30|31)$

钱的输入格式

1
2
3
4
5
6
7
8
^[1-9][0-9]*$
^(0|[1-9][0-9]*)$
^(0|-?[1-9][0-9]*)$
^[0-9]+(.[0-9]+)?$
^[0-9]+(.[0-9]{2})?$
^[0-9]+(.[0-9]{1,2})?$
^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$

xml文件

1
^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$

中文字符的正则表达式

1
[\u4e00-\u9fa5]

双字节字符

1
^[\x00-\xff]$

空白行的正则表达式

1
\n\s*\r

HTML标记的正则表达式

1
<(\S*?)[^>]*>.*?</\1>|<.*? />

首尾空白字符的正则表达式

1
2
^\s*|\s*$
(^\s*)|(\s*$)

腾讯QQ号

1
[1-9][0-9]{4,}

中国邮政编码

1
[1-9]\d{5}(?!\d)

IP地址

1
2
\d+\.\d+\.\d+\.\d+
((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

##中的正则表达式

创建正则表达式对象

直接创建正则表达式对象

1
let reg = /正则表达式/;

通过new关键字创建正则表达式对象

1
let reg = new RegExp("正则表达式");

获取匹配的字符串

  • 如果匹配成功,则返回匹配成功后截取的子字符串;如果匹配失败,则返回null

<str>:参与匹配的字符串

1
reg.exec("<str>");

验证正则表达式

  • 如果验证正确返回true;如果验证错误返回false

<str>:需要验证的字符串

1
reg.test("<str>");

完成

参考文献

QQ群——DT课堂 - 辛末 - 11月新群
哔哩哔哩——黑马程序员
哔哩哔哩——黑马程序员
哔哩哔哩——黑马前端
哔哩哔哩——骆昊jackfrued
segmentfault——老鼠拧刀满街找猫