前端 常用 正则表达式校验 合集

前言

前端开发中,一般表单页面都需要填写手机号、邮箱、身份证等,校验用户输入的是否正确,就要用到正则表达式,用正则表达式来匹配。

手机号校验

各大运营商手机号码段

中国移动信号段


	1340	1341	1342	1343	1344	1345		
	
	1346	1347	1348	135		136		137		138		
	
	139		147		150		151		152		157		158		
	
	159		178		182		183		184		187		188		
	
	195		198
	
	144		移动(物联网卡)	1440X号段
	
	147		移动	原3G上网卡、数据卡,部分有语音功能
	
	148		移动(物联网卡)	148XX号段
	
	165		移动(转售)	虚拟运营商
	
	1703	移动(转售)	虚拟运营商
	
	1705	移动(转售)	虚拟运营商
	
	1706	移动(转售)	虚拟运营商
	
	172		移动(物联网卡)	可接打电话、无短信功能
	
	195		移动	19年8月新批号段

中国联通信号段


	130		131		132		155		156		166	
	
	175		176		185		186
	
	140		联通(物联网卡)	1400号段
	
	145		联通(无线上网卡)	数据卡,只能上网,不能打电话发短信
	
	167		联通(转售)	虚拟运营商
	
	1704	联通(转售)	虚拟运营商
	
	1707	联通(转售)	虚拟运营商
	
	1708	联通(转售)	虚拟运营商
	
	1709	联通(转售)	虚拟运营商
	
	171		联通(转售)	虚拟运营商

中国电信信号段


	133		153		173		177		180	
		
	181		189		191		199
	
	1349	电信(卫星专用)	卫星移动电话
	
	141		电信(物联网卡)	1410X号段
	
	149		电信(物联网卡)	物联网等信息化应用专用号段
	
	162		电信(转售)	虚拟运营商
	
	1700	电信(转售)	虚拟运营商
	
	1701	电信(转售)	虚拟运营商
	
	1702	电信(转售)	虚拟运营商
	
	17400	电信(卫星专用)	17400-17405号段
	
	17401	电信(卫星专用)	17400-17405号段
	
	17402	电信(卫星专用)	17400-17405号段
	
	17403	电信(卫星专用)	17400-17405号段
	
	17404	电信(卫星专用)	17400-17405号段
	
	17405	电信(卫星专用)	17400-17405号段
	
	193		电信	19年7月新批号段

其他


	7406	应急通信	工信部应急通信保障中心持有
	
	17407	应急通信	工信部应急通信保障中心持有
	
	17408	应急通信	工信部应急通信保障中心持有
	
	17409	应急通信	工信部应急通信保障中心持有
	
	17410	应急通信	工信部应急通信保障中心持有
	
	17411	应急通信	工信部应急通信保障中心持有
	
	17412	应急通信	工信部应急通信保障中心持有
	
	192		广电
	
	1749	海事卫星专属	北京船舶通信导航有限公司持有

注意:此数据截止于2021年11月份

通过以上号段可以看出,手机号码起始1,第二位是3456789中的任意一个,第三位有的是0-9全段,有的只是部分,如下:

分析后位数字

13和18开头的手机号是全段


	13开头的手机号是全段:13 [0123456789] 比如130,131,132…139
	
	18开头的手机号是全段:18[0123456789] 比如180,181,182…189

15和19开头的手机号后面除4外都有,无154和194


	15 [012356789] 比如150,151,152,153,155…159
	
	19 [012356789] 比如190,191,192,193,195…159

17开头的手机号后面除9外都有


	17 [01235678] 比如170,171,172,173…178

14开头的手机号除2,3外都有,无142和143


	14[01456879] 比如140,141,144,145…149

16开头的手机号后面只有2567


	16[2567] 比如:162,165,166,167

最终得出正则

了解了运营商的最新号段,下面就写出手机号验证的最新正则表达式:


	/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/
	
	因为手机号都是以1开始的,所以也可以这样写:
	
	/^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/

身份证校验

简单校验

由于我们身份证排列格式比较统一,所以我们校验比较简单


	/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$)/

	//身份证号(18位)正则
	var cP = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
	//输出 true
	console.log(cP.test("11010519880605371X"));
	


复杂校验实例

在这里有一个简单的例子,对于身份证校验有一个比较清晰的认识

			<el-form class="demo-ruleForm" :model="row" :rules="rules" ref="checkFrom"  :model="rulesFrom">
			      <	div class="form-item-width" style="justify-content: center;">
              	<el-form-item label="证件号码" label-width="100px" prop="credentialsCode">
                   <el-input
                      class="input-cardnum"
                      name="card"
                      v-model="rulesFrom.credentialsCode"
                      autocomplete="off"
                    ></el-input>
                  </el-form-item>
                  <el-form-item label="手机号码" label-width="100px" prop="mobile" >
                    <el-input
                      class="input-cardnum"
                      name="card"
                      v-model="rulesFrom.mobile"
                      autocomplete="off"
                    ></el-input>
                  </el-form-item>
                  <el-form-item label="导游证号码">
                    <el-input clearable v-model="rulesFrom.tourGuideCardNum" placeholder="请输入"></el-input>
                  </el-form-item>
                </div>
              </el-form>
		data(){
		  const idCardValidity = (rule, code, callback) => {
		      var city = { 11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古", 21: "辽宁", 22: "吉林", 23: "黑龙江 ", 31: "上海", 32: "江苏", 33: "浙江", 34: "安徽", 35: "福建", 36: "江西", 37: "山东", 41: "河南", 42: "湖北 ", 43: "湖南", 44: "广东", 45: "广西", 46: "海南", 50: "重庆", 51: "四川", 52: "贵州", 53: "云南", 54: "西藏 ", 61: "陕西", 62: "甘肃", 63: "青海", 64: "宁夏", 65: "新疆", 71: "台湾", 81: "香港", 82: "澳门", 91: "国外 " };
		      var tip = ""
		      var pass = true
		      if (!code || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(code)) {
		        tip = "身份证号格式错误"
		        pass = false;
		      } else if (!city[code.substr(0, 2)]) {
		        // tip = "地址编码错误"
		        tip="身份证输入错误"
		        pass = false
		      } else {
		        // 18位身份证需要验证最后一位校验位
		        if (code.length === 18) {
		          code = code.split('')
		          // ∑(ai×Wi)(mod 11)
		          // 加权因子
		          var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
		          // 校验位
		          var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
		          var sum = 0
		          var ai = 0
		          var wi = 0
		          for (var i = 0; i < 17; i++) {
		            ai = code[i]
		            wi = factor[i]
		            sum += ai * wi
		          }
		          var last = parity[sum % 11];
		          if (parity[sum % 11] != code[17]) {
		            // tip = "校验位错误"
		            tip="身份证输入错误"
		            pass = false
		          }
		        }
		      }
		      if (!pass) {
		        callback(new Error(tip))
		      } else {
		        callback()
		      }
		    }
		    // 设置手机号的验证规则
		    const phoneRules = (rule, value, callback) => {
		      if (!value) {
		        callback(new Error('请输入联系方式'))
		      } else {
		        const reg = /^1[3|4|5|6|7|8][0-9]\d{8}$/
		        if (reg.test(value)) {
		          callback()
		        } else {
		          return callback(new Error('请输入正确的电话'))
		        }
		      }
		    }
		}
		return {
		rulesFrom:{
		  credentialsCode:" ",
		  mobile:" "
		},
   rules: {
        credentialsCode: [{ required: true, message: '请输入证件号', trigger: 'blur' },
          {
            pattern: /(^\d{8}(0\d|10|11|12)([0-2]\d|30|31)\d{3}$)|(^\d{6}(18|19|20)\d{2}(0\d|10|11|12)([0-2]\d|30|31)\d{3}(\d|X|x)$)/,
            message: '请输入正确的证件号'
          },
          { validator: idCardValidity, trigger: 'blur' }],
        cardphone:[
          {validator:phoneRules,trigger:'blur'}
        ],
        mobile:[
          {required: true,validator:phoneRules,trigger:'blur'}
        ],
        tourGuideCardNum: [
          {required: true,message: '请输入导游证号码',trigger: 'blur'},
          {pattern: /([D][-]\d{4}[-]\d{6})/, message: '请输入正确导游证号码,例:D-0000-000000'}
        ],
      },
}

注意:
1.规则方法写在data里return之前
身份证有效性校验规则来源与百度
校验公示:∑(ai×Wi)(mod 11)

其余正则表达式

校验字符的表达式


	//长度为3-20的所有字符
	^.{3,20}$
	
	//汉字
	^[\u4e00-\u9fa5]{0,}$
	
	//2-4个中文字符正则
	/^[\u4e00-\u9fa5]{2,4}$/   
	
	//英文和数字
	^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
	
	由26个英文字母组成的字符串
	^[A-Za-z]+$
	
	由26个大写英文字母组成的字符串
	^[A-Z]+$
	
	//由26个小写英文字母组成的字符串
	^[a-z]+$
	
	//由数字和26个英文字母组成的字符串
	^[A-Za-z0-9]+$
	
	//由数字、26个英文字母或者下划线组成的字符串
	^\w+$ 或 ^\w{3,20}$
	
	//中文、英文、数字包括下划线
	^[\u4E00-\u9FA5A-Za-z0-9_]+$
	
	//中文、英文、数字但不包括下划线等符号
	^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
	
	//可以输入含有^%&',;=?$\"等字符
	[^%&',;=?$\x22]+
	
	//禁止输入含有~的字符
	[^~\x22]+

数字正则

简单数字正则


	//数字
	 ^[0-9]$
	 
	//至少n位的数字
	^\d{n,}$
	
	//n位的数字
 	^\d{n}$
 	
	//m-n位的数字
	^\d{m,n}$

限制数字正则


	//零和非零开头的数字
	^(0|[1-9][0-9]*)$
	
	//非零开头的最多带两位小数的数字
	^([1-9][0-9]*)+(.[0-9]{1,2})?$
	
	//带1-2位小数的正数或负数
	^(\-)?\d+(\.\d{1,2})?$
	
	//正数、负数、和小数
	^(\-|\+)?\d+(\.\d+)?$
	
	//有两位小数的正实数
	^[0-9]+(.[0-9]{2})?$
	
	//有1~3位小数的正实数
	^[0-9]+(.[0-9]{1,3})?$
	

整数相关正则


	//正整数正则
	var posPattern = /^\d+$/;
	
	//负整数正则
	var negPattern = /^-\d+$/;
	
	//整数正则
	var intPattern = /^-?\d+$/;
	
	//输出 true
	console.log(posPattern.test("42"));
	
	//输出 true
	console.log(negPattern.test("-42"));
	
	//输出 true
	console.log(intPattern.test("-42"));
	
	非零的正整数
	//^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
	
	//非零的负整数
	'^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$'
	
	//非负整数
	^\d+$ 或 ^[1-9]\d*|0$
	
	//非正整数
	^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
	

浮点数相关正则


	//浮点数
	^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
	
	//非负浮点数
	^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
	
	//非正浮点数
	^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
	
	//正浮点数
	^[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-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]*)))$
	

其他关于数值正则


	//正数正则
	var posPattern = /^\d*\.?\d+$/;
	
	//负数正则
	var negPattern = /^-\d*\.?\d+$/;
	
	//数字正则
	var numPattern = /^-?\d*\.?\d+$/;
	
	console.log(posPattern.test("42.2"));
	console.log(negPattern.test("-42.2"));
	console.log(numPattern.test("-42.2"));
	

日期正则


	//日期正则,简单判定,未做月份及日期的判定
	var dP1 = /^\d{4}(\-)\d{1,2}\1\d{1,2}$/;
	
	//输出 true
	console.log(dP1.test("2017-05-11"));
	
	//输出 true
	console.log(dP1.test("2017-15-11"));
	
	//日期正则,复杂判定
	var dP2 = /^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$/;
	
	//输出 true
	console.log(dP2.test("2017-02-11"));
	//输出 false
	console.log(dP2.test("2017-15-11"));
	//输出 false
	console.log(dP2.test("2017-02-29"));
	

账号密码自定义校验


	//帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线)
	^[a-zA-Z][a-zA-Z0-9_]{4,15}$
	
	// 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线)
	^[a-zA-Z]\w{5,17}$
	
	//强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间)\
	^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$  

IP地址正则

	IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
	
	IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
	
	IP-v4地址:\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b (提取IP地址时有用)
	
	校验IP-v6地址:(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))
	
	子网掩码:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
	

电子邮箱


	/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
	
	//Email正则
	var ePattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	
	//输出 true
	console.log(ePattern.test("99154507@qq.com"));
	

URL正则


//URL正则
	var urlP= /^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/;
	
	//输出 true
	console.log(urlP.test("http://caibaojian.com"));

十六进制颜色正则


	//RGB Hex颜色正则
	var cPattern = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/;
	
	//输出 true
	console.log(cPattern.test("#b8b8b8"));
	

QQ号码


	/^[1-9][0-9]\d{4,9}$/

邮政编码


	/^[1-9]\d{5}$/

座机号码


	/^(0\d{2,3})-?(\d{7,8})$/

其他


	空白行的正则表达式:\n\s*\r (可以用来删除空白行)
	
	文件扩展名效验:^([a-zA-Z]\\:|\\\\)\\\\([^\\\\]+\\\\)*[^\\/:*?"<>|]+\\.txt(l)?$

	判断IE版本:^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$

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

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

结尾总结

俗话说:授人以鱼不如授人以渔,所以还是希望大家去学习正则的语法
我觉得w3cschool是一个不错的平台,希望同大家一起努力掌握新知识
附链接:https://www.w3cschool.cn/regexp/zoxa1pq7.html

参考资料:

正则表达:https://blog.csdn.net/itbrand/article/details/109239620

最新号码段:https://blog.csdn.net/NNXia555/article/details/121402290

简单身份证校验:https://blog.csdn.net/Embrace924/article/details/78247707

身份证校验:https://www.jianshu.com/p/209d99a8c980

正则合集:https://zhuanlan.zhihu.com/p/28058115

正则合集:https://zhuanlan.zhihu.com/p/30573054

正则合集:https://blog.csdn.net/ZYC88888/article/details/98479629

正则语法:https://www.w3cschool.cn/regexp/zoxa1pq7.html

正则表达式测试

在线正则表达式测试: http://tool.oschina.net/regex/

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值