前言
正则表达式,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。维基百科
修饰符(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)
集合(Character Set)
a、b、c中的任意一个可以被正确匹配
范围(Character Range)
从a到c中的任意一个可以被正确匹配
量词(Quantifier)
| 量词 |
备注 |
+ |
一个或多个,相当于{1,} |
? |
零个或一个,相当于{0,1} |
* |
零个或多个,相当于{0,} |
确切的位数
只能出现1次
范围
最少出现1次,最大出现3次
最少出现1次,不限制最大次数
最少出现1次,最大次出现3次
贪婪模式和惰性模式
贪婪模式
input
output
惰性模式
input
output
捕获组(Capturing Group)
input
output
为捕获组定义组名
为捕获组定义量词
ab出现2次
input
output
捕获组中的逻辑或
a或b出现2次
input
output
捕获组中的逻辑非
非a出现2次
input
output
基本语法
边界符
匹配字符串的开始
匹配字符串的结束
定义符合条件的字符匹配
指定一个确定的字符或字符串
完全匹配
或匹配
指定一个不确定的字符
指定字符
指定范围
定义不符合条件的字符匹配(取反)
定义捕获组
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
| (?<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
| full match: 11 group one: 1
|
定义前瞻数据
指定次数
指定一个确定的次数
不指定一个确定的字符
指定次数为一个范围
区间
大于等于
指定次数为1次或0次
指定次数为1次及以上
指定次数为0次及以上
通配符
任何空白字符
任何非空白字符
一个数字字符
一个非数字字符
一个数字、字母、下划线字符
一个非数字、字母、下划线字符
除了换行符以外的任意一个字符
常用的正则表达式
校验数字的表达式
数字
n位的数字
至少n位的数字
m~n位的数字
0和非0开头的数字
非0开头的最多带两位小数的数字
1
| ^([1-9][0-9]*)+(.[0-9]{1,2})?$
|
带1~2位小数的正数或负数
正数、负数、小数
有两位小数的正实数
有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
| ^-[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 2
| ^[A-Za-z0-9]+$ ^[A-Za-z0-9]{4,40}$
|
长度为3~20的所有字符
由26个英文字母组成的字符串
由26个大写英文字母组成的字符串
由26个小写英文字母组成的字符串
由数字和26个英文字母组成的字符串
由数字、26个英文字母或者下划线组成的字符串
中文、英文、数字、下划线
1
| ^[\u4E00-\u9FA5A-Za-z0-9_]+$
|
中文、英文、数字,不包括下划线等符号
1 2
| ^[\u4E00-\u9FA5A-Za-z0-9]+$ ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
|
可以输入含有^%&’,;=?$"等字符
禁止输入含有~的字符
特殊需求表达式
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 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
| ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
|
日期格式
一年的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]$
|
中文字符的正则表达式
双字节字符
空白行的正则表达式
HTML标记的正则表达式
1
| <(\S*?)[^>]*>.*?</\1>|<.*? />
|
首尾空白字符的正则表达式
腾讯QQ号
中国邮政编码
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))
|
##中的正则表达式
创建正则表达式对象
直接创建正则表达式对象
通过new关键字创建正则表达式对象
1
| let reg = new RegExp("正则表达式");
|
获取匹配的字符串
- 如果匹配成功,则返回匹配成功后截取的子字符串
- 如果匹配失败,则返回null
<str>:参与匹配的字符串
验证正则表达式
- 如果验证正确返回true;如果验证错误返回false
<str>:需要验证的字符串
完成
参考文献
QQ群——DT课堂 - 辛末 - 11月新群
哔哩哔哩——黑马程序员
哔哩哔哩——黑马程序员
哔哩哔哩——黑马前端
哔哩哔哩——骆昊jackfrued
segmentfault——老鼠拧刀满街找猫