【笔记】正则表达式

前言

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

基本语法

边界符

匹配字符串的开始

1
^

匹配字符串的结束

1
$

定义符合条件的字符匹配

指定一个确定的字符或字符串

完全匹配
  • 必须是a字符
1
a
1
(a)
或匹配
  • 必须是字符串ab或者ac
1
ab|ac
1
(ab|ac)

指定一个不确定的字符

  • 只要包含abc中的任何一种即可
指定字符
1
[abc]
指定范围
1
[a-c]

定义不符合条件的字符匹配(取反)

  • 只要不包含abc中的任何一种即可
1
[^abc]

指定次数

  • 紧跟字符,表示前一个字符允许出现的次数

指定一个确定的次数

1
a{1}

不指定一个确定的字符

指定次数为一个范围
区间
  • 1~2次
1
a{1,2}
大于等于
  • 1次及以上
1
a{1,}
指定次数为1次或0次
  • 有或者没有都可以,等价于{0,1}
1
a?
指定次数为1次及以上
  • 等价于{1,}
1
a+
指定次数为0次及以上
  • 任意次匹配,等价于{0,}
1
a*

通配符

任何空白字符

  • 包括换行符、空格、制表符
1
\s

任何非空白字符

  • 除了换行符、空格、制表符
1
\S

一个数字字符

  • 等价于[0-9]
1
\d

一个非数字字符

  • 等价于[^0-9]
1
\D

一个数字、字母、下划线字符

  • 等价于[0-9a-zA-Z_]
1
\w

一个非数字、字母、下划线字符

  • 等价于[^0-9a-zA-Z_]
1
\W

除了换行符以外的任意一个字符

1
.

常用的正则表达式

校验数字的表达式

数字

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月新群
哔哩哔哩——黑马程序员
哔哩哔哩——黑马程序员
哔哩哔哩——黑马前端