【笔记】正则表达式

前言

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

修饰符(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
^

匹配字符串的结束

1
$

定义符合条件的字符匹配

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

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

指定一个不确定的字符

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

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

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

定义捕获组

  • 通过()定义捕获组

  • 需要匹配的数据

1
2006-01-02
  • 正则表达式
1
(\d{4})-(\d{2})-(\d{2})
  • 得到的匹配数据
1
2
3
4
full match: 2006-01-02
group 1: 2006
group 2: 01
group 3: 02
定义命名捕获组
  • 在括号最前面添加?<name>?'<name>'为捕获组命名

捕获组名最好不要重名,虽然有的编程语言(C#、Perl)支持重名捕获组,但是还有的编程语言(Java、Python)不支持重名捕获组

  • 需要匹配的数据
1
2006-01-02
  • 正则表达式
1
(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
1
(?'<year>'\d{4})-(?'<month>'\d{2})-(?'<day>'\d{2})
  • 得到的匹配数据
1
2
3
4
full match: 2006-01-02
group year: 2006
group month: 01
group day: 02
定义非捕获组
  • 非捕获组用于在不得不需要括号但不希望数据分组的时候,在括号内最前面添加?:,则该括号不会进行分组

  • 需要匹配的数据

1
2
3
red
green
blue
  • 正则表达式
1
(?:red|green|blue)
  • 得到的匹配数据
1
full match: red
1
full match: green
1
full match: blue

引用捕获组

  • 通过\k<name>引用捕获组

  • 需要匹配的数据

1
112
  • 正则表达式
1
(?<one>1)\k<one>
  • 得到的匹配数据
1
2
full match: 11
group one: 1

定义前瞻数据

  • 前瞻数据不会被获取,但是会被用于筛选数据
1
(?=a)

指定次数

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

指定一个确定的次数

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月新群
哔哩哔哩——黑马程序员
哔哩哔哩——黑马程序员
哔哩哔哩——黑马前端
哔哩哔哩——骆昊jackfrued
segmentfault——老鼠拧刀满街找猫