常用正则表达式

Email

var emailRegex = /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/;

via: https://www.w3.org/TR/html-markup/datatypes.html#form.data.emailaddress-def

Mobile

限大陆三大运营商 via: https://zh.wikipedia.org/wiki/%E4%B8%AD%E5%9B%BD%E5%86%85%E5%9C%B0%E7%A7%BB%E5%8A%A8%E7%BB%88%E7%AB%AF%E9%80%9A%E8%AE%AF%E5%8F%B7%E7%A0%81 https://zhuanlan.zhihu.com/p/40878967

// 忽略 卫星电话 1349 等 号段
var mobileRegex1 = /^1(3\d|4[01456789]|5\d|6[567]|7[01235678]|8\d|9[189])\d{8}$/;
// 忽略 物联网 号段,物联网 13位
var mobileRegex1 = /^1(3\d|4[579]|5\d|6[567]|7[01235678]|8\d|9[189])\d{8}$/;
// 不忽略
var mobileRegex2 = /^1(((3[012356789]|4[01456789]|5\d|6[567]|7[01235678]|8\d|9[189])\d{8})|(34[0-8]\d{7}))$/;
var mobileRegex3 = /^1((34[0-8]\d{7})|((3[012356789]|4[01456789]|5\d|6[567]|7[01235678]|8\d|9[189])\d{8}))$/;

// 移动
var isYdMobileRegex = /^1(((34[0-8]|70[356])\d{7})|((3[5-9]|4[78]|5[012789]|65|7[28]|8[23478]|98)\d{8}))$/;
// 联通
var isLtMobileRegex = /^1((70[4789]\d{7})|((3[012]|4[056]|5[456]|6[67]|7[156]|8[56])\d{8}))$/;
// 电信
var isDxMobileRegex = /^1((349|70[012]|740)\d{7})|((33|4[19]|53|7[37]|8[019]|9[19])\d{8}))$/;

三大运营商号段:

  • 移动: 134-139,144(物),147(数据卡号段),148(物),150-152,157-159,165(虚),172(?),178,182-184,187,188,198,1703(虚),1705(虚),1706(虚)
  • 联通: 130-132,140(物),145(数据卡号段),146(物),154,155,156,166,167(虚),171(虚),175,176,185,186,1704,1707-1709(虚)
  • 电信: 133,134-9(卫),141(物),149(数据卡号段),153,173,174-00~05(卫),177,180,181,189,191,199,1700-1702(虚)

注意:
移动实际只有 1340-1348 号段, 1349作为卫星通信电话专用
133 号段使用在无线网卡上

卫星电话:

  • 电信:134-9、174-00~05
  • 海事:174-9
  • 应急:174-06~12

上网卡/数据卡:

  • 移动:147
  • 联通:145
  • 电信:149

140/141/144 这几个号段是13位的物聯網號段,142/143也已被預訂
物联网卡号:

  • 移动:144/1440X、148/148XX
  • 联通:140/140XX、146/146XX
  • 电信:141/1410X

虚拟运营商:

  • 移动:1703、1705、1706
  • 联通:167、171、1704、1707、1708、1709
  • 电信:1700、1701、1702

2017-03-27 统计新增/修改:

  • 移动:148
  • 联通:154,175,1704
  • 电信:149,173

2017-11 统计新增/修改:

  • 联通:140(物联网号段)

2018-01-04 统计新增/修改

  • 移动:172, 198, 1440(物联网号段), 10648(物联网号段)
  • 联通:146, 166, 171, 10646(物联网号段)
  • 电信:199, 1410(物联网号段), 10649(物联网号段)
    其中之前的移动141不用了?
    其中之前的联通154不用了?
    另外 物联网号段 均为 13位 号段, 不计入正则中
    141 和 154 比较有争议

2018-02 统计新增/修改

  • 移动:165(虚拟运营商)

2018-08 统计新增/修改

  • 联通:167(虚拟运营商)
  • 电信:191

MAC Mobile

8位 62/63/65/66/68 起头
via: https://telecommunications.ctt.gov.mo/web/tc/generalinfo/allocatednum

var regex = /^6(2|3|5|6|8)\d{6}$/;

HK Mobile

8位,按粗略算 有 5/6/9 起头
via: http://www.ofca.gov.hk/filemanager/ofca/tc/content_311/no_plan.pdf

var regex1 = /^(5[1-7|9]\d{6})|(6((0[1-9]\d{5})|([1-9]\d{6})))|(9((0[1-9]\d{5})|([1-8]\d{6})))$/;
var regex2 = /^(5[1-7|9]\d{6})|([69]0[1-9]\d{5})|(6[1-9]\d{6})|(9[1-8]\d{6})$/;
var regex3 = /^(\+?852)?((5[1-7|9]\d{6})|([69]0[1-9]\d{5})|(6[1-9]\d{6})|(9[1-8]\d{6}))$/;

HK ID-CARD

via: https://zh.wikipedia.org/wiki/%E9%A6%99%E6%B8%AF%E8%BA%AB%E4%BB%BD%E8%AD%89

Password

via: how-to-validate-password-with-regular-expression 注意 MKyong 的原文的表达式有些许缺陷, 看清楚下面的评论

var pwdRegex = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%])[\da-zA-Z@#$%]{6,20}$/;

/*
(                 # Start of group
  (?=.*\d)        # must contains one digit from 0-9
  (?=.*[a-z])     # must contains one lowercase characters
  (?=.*[A-Z])     # must contains one uppercase characters
  (?=.*[@#$%])    # must contains one special symbols in the list "@#$%"
  [\da-zA-Z@#$%]  # match any characters in the list "\da-zA-Z@#$%" with previous condition checking
  {6,20}          # length at least 6 characters and maximum of 20	
)                 # End of group
*/

IDCard (未验证)

修改备注:
湖南耒阳市淝田乡 行政区划 430419
修改第五、六位表示县的行政区划代码 "01-18" 为 "01-19"

20170816 市级设置成 00 - 99 算了 发现区级存在 00 的身份证号码 442000

via:
1.GB 11643-1999 公民身份号码 from 维基文库
2.居民身份证号码 from 百度百科
3.https://github.com/chaijiawei/checkCnIDCard
4.Java的身份证号码工具类

身份证号码由于有算法进行准确的验证, 所以正则部分不必太过精确, 越精确表达式越长越复杂

结构

####地址码

(身份证号码前六位)表示编码对象常住户口所在县(市、镇、区)的行政区划代码

1. 第一、二位表示省(自治区、直辖市、特别行政区)
2. 第三、四位表示市(地级市、自治州、盟及国家直辖市所属市辖区和县的汇总码)。其中,01-20,51-70表示省直辖市;21-50表示地区(自治州、盟)
3. 第五、六位表示县(市辖区、县级市、旗)。01-19表示市辖区或地区(自治州、盟)辖县级市;21-80表示县(旗);81-99表示省直辖县级市

####生日期码

(身份证号码第七位到第十四位)表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示

####顺序码

(身份证号码第十五位到十七位)地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性

####校验码

作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替

正则分段解析

####省

var provinces = { 
    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: "国外"
};

// 粗略认为是 11-82
var reg = /^1[1-9]|[2-7]\d|8[012]$/;

####市

// 00 - 99
var reg = /^\d{2}$/;

####县

// 00 and 01-19 and 21-99
var reg = /^0\d|1[0-9]|2[1-9]|[3-9]\d$/;

####省市县

var reg = /^(1[1-9]|[2-7]\d|8[012])(\d{2})(0\d|1[0-8]|2[1-9]|[3-9]\d)$/;
// 真要粗略地算的话 \d{6} 也是可以的

####年月日

// 实际上应该利用 Date 构建日期, 再对比原数值
// dateStr : 2016-01-01
function isISODateString(dateStr) {
    if (!dateStr && !(typeof dateStr === 'string' 
        && Object.prototype.toString.call(dateStr) === '[object String]')) {
        return false;
    }

    if (dateStr.length !== 10) { return false; }

    var matchStr = dateStr.match(/^\d{4}-\d{2}-\d{2}$/);
    if (!matchStr) {
        return false;
    }

    var temp = dateStr.split('-');
    var year = parseInt(temp[0], 10);
    var month = parseInt(temp[1], 10);
    var dayOfMonth = parseInt(temp[2], 10);

    var d = null;
    try {
        d = new Date(dateStr);
    } catch(e) {
        return false;
    }

    return (d.getFullYear() === year 
            && (d.getMonth() + 1) === month 
            && d.getDate() === dayOfMonth);
}

// 粗略版 0000-9999 01-12 01-31
var reg1 = /^\d{4}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])$/;

// 精细版 不大准确 忽略闰年2月份只有28
// 年 合理范围 1900-2099
var regY = /^(19|20)\d{2}$/;
// 月日
// 31日的月份
var regM1 = /^(0[13578]|10|12)(0[1-9]|[12]\d|3[01])$/;
// 2月份 忽略闰年
var regM2 = /^02(0[1-9]|[12]\d)$/;
// 30日的月份
var regM3 = /^(0[469]|11)(0[1-9]|[12]\d|30)$/;

var reg2 = /^((19|20)\d{2})(((0[13578]|10|12)(0[1-9]|[12]\d|3[01]))|(02(0[1-9]|[12]\d))|((0[469]|11)(0[1-9]|[12]\d|30)))$/;

####顺序码&校验码

var reg = /^\d{3}(\d|X)$/;

####合并

// 粗略版
var reg1 = /^\d{6}(\d{4}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01]))\d{3}X$/;
// 精细版
var reg2 = /^((1[1-9]|[2-7]\d|8[012])(\d{2})(0\d|1[0-8]|2[1-9]|[3-9]\d))(((19|20)\d{2})(((0[13578]|10|12)(0[1-9]|[12]\d|3[01]))|(02(0[1-9]|[12]\d))|((0[469]|11)(0[1-9]|[12]\d|30))))\d{3}(\d|X)$/;

Chinese Character (未完成)

via:
JavaScript 正则表达式匹配汉字
CJK Unified Ideographs
中日韓統一表意文字
Regular Expression Unicode Syntax Reference

转载于:https://my.oschina.net/keywindy/blog/617272

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值