正则表达式
正则表达式
一、正则表达式
1.定义
检查、匹配字符串的表达式。是描述规则,主流语言都有良好的支持。
2.使用场景
字符串校验,查询与替换
3.正则表达式测试地址
https://tool.oschina.net/regex/
二、字符的范围匹配
正则表达式 | 说明 | 正确 | 错误 |
---|---|---|---|
A | 精准匹配单个字符 | A | a |
x|y | 允许出现的2个字符 | Y | n |
[xyz] | 字符集合,允许出现集合内任意单个字符 | z | c |
[a-z]、[A-Z]、[0-9] | 字符范围 | z、W、3 | Z、w、w |
[^xyz]、[^0-9] | 集合内字符不允许出现 | w、w | x、0 |
三、元字符
1.定义
单指某一类字符的字符是元字符。
正则表达式 | 说明 | 正确 | 错误 |
---|---|---|---|
\d | 匹配任意单个数字 | 8 | i |
\D | 匹配\d规则之外的任意单个字符 | i | 8 |
\w | 匹配任意单个字母数字下划线 | Y | & |
\W | 匹配\w之外的任意单个字符 | & | Y |
\s | 匹配单个空格 | x | |
\n | 匹配单个换行符 | x | |
. | 匹配任意单个字符(换行符除外) | – | – |
\. | 特殊字符,只匹配. | . | 1 |
2.习题
1.匹配3213.383219
\d\d\d\d.\d\d\d\d\d\d
2.匹配杭州与宁波的座机号码(0571|0574-xxxxxxxx)
Eg.0571-12345678
057[1|4]-\d\d\d\d\d\d\d\d
3.请匹配18位身份证号(17位数字+数字或大小写x)
Eg.350122198810051539
科普:第一位:代表的是所在地区(1-6以及8)
第2-16位:代表的是任意的数字
最后一位:数字或大小写x
[1234568]\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d[0-9xX]
四、多次重复匹配
正则表达式 | 说明 | 正确 | 错误 |
---|---|---|---|
A{N} | 精准匹配N次(Eg.A{3}) | AAA | AA |
A{N,} | 最少出现N次(Eg.A{3,}) | AAA | AA |
\d{N,M} | 约定出现的最少次数和最大次数(Eg.\d{3,5}) | 1234 | 12 |
\d* | 可以出现0次至无限次,相当于{0,} | 1234 | – |
\d+ | 最少出现一次,相当于{1,} | 12 | |
\d? | 最多出现一次,相当于{0,1} | 1 | 12 |
1.匹配3213.383219
\d{4}.\d{6}
2.匹配杭州与宁波的座机号码(0571|0574-xxxxxxxx)
Eg.0571-12345678
057[1|4]-\d{8}
3.请匹配18位身份证号(17位数字+数字或大小写x)
Eg.350122198810051539
[1234568]\d{16}[0-9xX]
4.验证短信验证码(6位数字)
Eg.d123456
\d{6} == \d\d\d\d\d\d\d
5.匹配全国座机号(区号3位或4位-电话号码7位或8位)
Eg.0591-12345678
\d{3,4}-\d{7,8}
6.请匹配英文姓名(Eg.James Waston)
[A-Z][a-z]{1,}\s[A-Z][a-z]{0,}
五、定位匹配
1.定义
确定开头与结尾的字符
正则表达式 | 说明 | 正确 | 错误 |
---|---|---|---|
^A.* | 头匹配 | ABC | CBA |
.*A$ | 尾匹配 | CBA | ABC |
^A.*A^ | 全字匹配 | ACCCA | ACCCB |
六、贪婪模式与非贪婪模式
1.贪婪模式
①定义
在满足条件的情况下尽可能多匹配到字符串。贪婪模式是一种默认的匹配模式。
Eg.520131499
正则表达式:\d{6,7}
匹配结果:5201314
2.非贪婪模式
①定义
在满足条件的情况下尽可能少匹配到字符串
Eg.520131499
正则表达式: \d{6,7}?
匹配结果:520131
七、表达式分组
1.定义
分组将"正则"分组分为多个子表达式
Eg.wanwanwanwanshuaishuaishuaishuai
正则表达式:(wanwan){2}(shuaishuai){2}
1.匹配验证码(4位或6位)
Eg.7777
正则表达式:^\d{4,6}$(×)==》要是5位的话也会匹配成功
正则表达式:(^\d{4}$)|(^\d{6}$)
2.匹配车牌号(冀A-U888G)
正则表达式:^([冀黑粤晋][A-Z])-([A-Z0-9]{5})$
3.匹配中文或英文姓名
英文Eg.James Waston
正则表达式:^[A-Z][a-z]+\s[A-Z][a-z]*$
中文Eg.张三
^[\u4e00-\u9fa5]*$
整合
(^[\u4e00-\u9fa5]$)|(^[A-Z][a-z]+\s[A-Z][a-z]$)
八、JavaScript表单校验
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>正则表达式</title>
</head>
<body>
<form action="#" method="post" id="formInfo">
<!-- 信息不通过 -->
<div id="error" style="color: red"></div>
<!-- 姓名 -->
<div>姓名:<input id="name" name="name"/></div>
<!-- 身份证 -->
<div>身份证:<input id="idno" name="idno"></div>
<!-- 提交 -->
<div><input type="submit"/></div>
</form>
<script>
document.getElementById("formInfo").onsubmit = function () {
//名字校验
const regex1 = /^[\u4e00-\u9fa5]{2,10}$/;
//身份证校验
const regex2 = /^[1234568]\d{16}[0-9xX]$/;
//接收用户真正输入的数据
let name = document.getElementById("name").value;
let idno = document.getElementById("idno").value;
//test():要求传入实际的数据来判断是否符合正则表达式
if(!regex1.test(name)){
document.getElementById("err").innerHTML="无效姓名";
//一定要return false!!表单才不会提交
return false;
}else if(!regex2.test(idno)){
document.getElementById("err").innerHTML="无效身份证号";
return false;
}else{
alert("验证通过,准备提交");
return true;
}
}
</script>
</body>
</html>