【专题】常用JavaScript正则表达式(regexp)汇编与示例

1 概述

1.1 前言

目前收集整理了21个常用的javaScript正则表达式,其中包括用户名、密码强度、整数、数字、电子邮件地址(Email)、手机号码、身份证号、URL地址、 IP地址、 十六进制颜色、 日期、 微信号、车牌号、中文正则等。表单验证处理必备,赶紧收藏吧!

还会陆续加入新的正则进来,大家多提宝贵意见!

2 正则列表

2.1 用户名正则

2.1.1 基本用户名正则

在做用户注册时,都会用到用户名正则校验。

定义基本用户名命名规则如下:

  • 最短4位,最长16位 {4,16}
  • 可以包含小写大母 [a-z] 和大写字母 [A-Z]
  • 可以包含数字 [0-9]
  • 可以包含下划线 [ _ ] 和减号 [ - ]
  • 首字母只能是大小写字母
var pattern = /^[a-zA-Z][a-zA-Z0-9_-]{3,15}$/;
//输出 true
console.log("ifat3 : "+pattern.test('ifat3'));
//输出 true
console.log("Ifat3 : "+pattern.test('Ifat3'));
//输出 true
console.log("ke30 : "+pattern.test('ke30'));
//输出 false
console.log("30ke : "+pattern.test('30ke'));
//输出 false
console.log("ke3 : "+pattern.test('ke3'));
输出 false
console.log("ke30@ : "+pattern.test('ke30@'));
//输出 false
console.log("ke30ke30ke30ke30ke30 : "+pattern.test('ke30ke30ke30ke30ke30'));

查看示例程序

2.1.2 中文用户名正则

如果规则中加入允许中文用户名,则变更正则表达式如下:

var pattern = /^[a-zA-Z\u4E00-\u9FA5][a-zA-Z0-9\u4E00-\u9FA5_-]{3,15}$/;
//输出 true
console.log("ifat3 : "+pattern.test('ifat3'));
//输出 true
console.log("Ifat3 : "+pattern.test('Ifat3'));
//输出 true
console.log("三十课毛瑞 : "+pattern.test('三十课毛瑞'));
//输出 false
console.log("30ke : "+pattern.test('30ke'));
//输出 false
console.log("ke3 : "+pattern.test('ke3'));
//输出 false
console.log("ke30@ : "+pattern.test('ke30@'));
  //输出 false
console.log("ke30ke30ke30ke30ke30 : "+pattern.test('ke30ke30ke30ke30ke30'));

其中[\u4E00-\u9FA5]是汉字的正则匹配,包括基本汉字2万多个,其中\u4E00表示汉字“一”,具体请参见《汉字unicode编码范围》。

查看示例程序

2.2 密码强度正则

//密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
var pPattern = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/;
//输出 true
console.log("iFat3#:"+pPattern.test("iFat3#"));

上述正则表达式只能对用户密码强度进行基本的通过性判定,关于密码强度验证更多的内容可参见:基于规则评分的密码强度检测算法分析及实现

查看示例程序

2.3 数字相关正则

2.3.1 整数正则

//正整数正则
var posPattern = /^\d+$/;
//负整数正则
var negPattern = /^-\d+$/;
//整数正则
var intPattern = /^-?\d+$/;
//输出 true
console.log("30:"+posPattern.test("30"));
//输出 true
console.log("-30:"+negPattern.test("-30"));
//输出 true
console.log("-30:"+intPattern.test("-30"));

查看示例程序

2.3.2 浮点数正则

//正浮点数正则
var posPattern = /^\d*\.\d+$/;
//负浮点数正则
var negPattern = /^-\d*\.\d+$/;
//两位小数正则
var twoPattern = /^-?\d*\.\d{2}$/;  
//输出 true
console.log("30.2:"+posPattern.test("30.2"));
//输出 true  
console.log("-30.2:"+negPattern.test("-30.2"));
//输出 true  
console.log("-30.22:"+twoPattern.test("-30.22"));

查看示例程序

2.3.3 整数浮点数正则

可以是整数也可以是浮点数

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

查看示例程序

2.4 日期正则

2.4.1 出生日期正则

var pattern = /^((19[2-9]\d{1})|(20((0[0-9])|(1[0-8]))))\-((0?[1-9])|(1[0-2]))\-((0?[1-9])|([1-2][0-9])|30|31)$/;
//输出 true
console.log(pattern.test("1923-3-18"));
//输出 true
console.log(pattern.test("1923-4-31"));
//输出 true
console.log(pattern.test("1923-2-29"));
//输出 true
console.log(pattern.test("2016-2-29"));

上述正则验证还不完善,主要是2,4,6,9,11月份的天数问题。

查看示例程序

2.4.2 通用日期正则

//日期正则,复杂判定
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"));

查看示例程序

2.5 Email正则

2.5.1 基本Email正则

var pattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
//输出 true
console.log(pattern.test('cn30ke@163.com'));
//输出 true
console.log(pattern.test('ifat3@sina.com.cn'));
//输出 true
console.log(pattern.test('ifat3.it@163.com'));
//输出 true
console.log(pattern.test('ifat3_-.@30ke.cn'));
//输出 false
console.log(pattern.test('ifat3@30ke.online'));
//输出 false
console.log(pattern.test('毛瑞@30ke.cn'));

基本Email正则是最常用的验证方式,也适合大多数的应用场景。从以上测试可以看出,该表达式不支持.online及.store结尾的域名。如需兼容这类域名(大于4位),调整正则结尾{2,4}的限制部分即可(例:{2,8})。另一个问题是Email用户名不能包括中文。

查看示例程序

2.5.2 中文名Email正则

根据前一正则中的问题,追加两条规则如下:

  • 用户名可以包括中文 [\u4e00-\u9fa5]
  • 域名结尾最长可为8位 {2,8}
var pattern = /^([A-Za-z0-9_\-\.\u4e00-\u9fa5])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,8})$/;
//输出 true
console.log(pattern.test('cn30ke@163.com'));
//输出 true
console.log(pattern.test('ifat3@sina.com.cn'));
//输出 true
console.log(pattern.test('ifat3.it@163.com'));
//输出 true
console.log(pattern.test('ifat3_-.@30ke.cn'));
//输出 true
console.log(pattern.test('ifat3@30ke.online'));
//输出 true
console.log(pattern.test('毛瑞@30ke.cn'));

查看示例程序

2.5.3 特定域名Email正则

在手机验证码出现之前,差不多邮箱验证是保证用户唯一性的唯一条件。而临时邮箱(也称10分钟邮箱或一次性邮箱)的出现,则使得邮箱验证及帐户激活这种机制失去了意义。而临时邮箱的地址是不可枚举的,我们只能才采取白名单的方式,只允许有限的邮箱域名通过验证。

var pattern = /^([A-Za-z0-9_\-\.])+\@(163.com|qq.com|30ke.cn)$/;
//输出 true
console.log(pattern.test('cn30ke@163.com'));
//输出 false
console.log(pattern.test('ifat3@sina.com.cn'));
//输出 true
console.log(pattern.test('ifat3.it@163.com'));
//输出 true
console.log(pattern.test('ifat3_-.@30ke.cn'));
//输出 false
console.log(pattern.test('ifat3@30ke.online'));
//输出 false
console.log(pattern.test('毛瑞@30ke.cn'));

此方法虽然能保证验证安全性,但是如果白名单太长会造成模式字符串太长。这时可以将邮箱域名白名单写成数组,利用正则表达式做初步验证,用白名单做域名的二次验证。

常用域名白名单数组:

var domains= ["qq.com","163.com","vip.163.com","263.net","yeah.net","sohu.com","sina.cn","sina.com","eyou.com","gmail.com","hotmail.com"];

上述白名单只列举了常用的11种邮箱域名,大家可以根据需要适当补充或删减。

查看示例程序

2.6 手机号码正则

//手机号正则
var mPattern = /^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$/;
//输出 true
console.log(mPattern.test("18600000000"));

查看示例程序

2.7 身份证号正则

//身份证号(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"));

上述正则只能对身份证号进行基本的通过性判定,关于公民身份号码判定的更多内容可参见文档:公民身份号码正确性判定及程序实现

查看示例程序

2.8 URL正则

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

查看示例程序

2.9 IP地址

2.9.1 IPv4地址正则

//ipv4地址正则
var ipP = /^(?:(?: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]?)$/;
//输出 true
console.log(ipP.test("115.28.47.26"));

查看示例程序

2.9.2 IPv6地址正则

//IPV6正则
var pattern = /(([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]))/;
//输出 true
console.log(pattern.test("fe80:0000:0000:0000:0204:61ff:fe9d:f156"));

查看示例程序

2.10 十六进制颜色正则

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

查看示例程序

2.11 QQ号码正则

//QQ号正则,5至11位
var qqPattern = /^[1-9][0-9]{4,10}$/;
//输出 true
console.log(qqPattern.test("65974040"));

查看示例程序

2.12 微信号正则

//微信号正则,6至20位,以字母开头,字母,数字,减号,下划线
var wxPattern = /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/;
//输出 true
console.log(wxPattern.test("RuilongMao"));

查看示例程序

2.13 车牌号正则

//车牌号正则
var cPattern = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/;
//输出 true
console.log(cPattern.test("京K39006"));

查看示例程序

2.14 包含中文正则

//包含中文正则
var cnPattern = /[\u4E00-\u9FA5]/;
//输出 true
console.log(cnPattern.test("30课"));

查看示例程序

3 结尾

3.1 结语

本人水平有限,如有错误,请不吝指正!谢谢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容