原稿:语雀 · 正则表达式 · 原目录:手撕代码 › 正则表达式
更多可参考regexp.js
日期
判断日期格式是否符合 ‘2017-05-11’的形式,简单判断,只判断格式
// 判断日期格式是否符合 '2017-05-11'的形式,简单判断,只判断格式
let regexp = /^\d{4}-\d{2}\-\d{2}$/;
let num = "2017-05-11";
console.log(num.match(regexp));
邮箱判断
邮箱的基本格式为“名称@域名”
允许多级域名 a.com.cn
名称、域名开头的字符串中允许出现 “_”
名称、域名开头的字符串不可为空
function chkMail(email) {
return /^\w+@\w+(\.\w+)+$/.test(email);
}
// 测试
console.log(chkMail("test123@test.com.cn")); // true
console.log(chkMail("test123@.com.cn")); // false
console.log(chkMail("@test.com.cn")); // false
用户名 & 密码格式
用户名格式:字母开头,允许5-16字节,允许字母数字下划线组合
密码格式:最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
用户名正则比较容易,可以使用 \w 化简(“单字”字符:拉丁字母或数字或下划线 _)
// 用户名正则,字母开头,允许5-16字节,允许字母数字下划线组合
let regx1 = /^[a-zA-Z]\w{4,15}$/;
// regx1 = /^[a-zA-Z][a-zA-Z0-9_]{4,15}$/;
密码格式需要使用“前瞻断言”,语法为:x(?=y),表示 “匹配 x, 仅在后面是 y 的情况”
最少6位 | (?=.{6,}) |
至少一个大写字母 | (?=.*[A-Z]) 容易写成 (?=[A-Z]),但后者要求大写字母必须紧接着前一个匹配到的字符,前者只则是出现在任意字符后都可以 |
至少一个小写字母 | (?=.*[a-z]) |
至少一个数字 | (?=.*\d) |
至少一个特殊字符 | (?=.*[!@#$%^&*?]) |
// 密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
let regx2 = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*?]).*$/;

断言中的内容一般只是作为条件,不会出现在匹配的结果中,但如果将断言内容使用括号包裹,则断言表达式也会被捕获,可以使用 match() 查看捕获到的部分,如下
// 用户名格式:字母开头,允许5-16字节,允许字母数字下划线组合
// 密码格式:最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
let reg = /^.*(?=(.{6,}))(?=(.*[A-Z]))(?=(.*[a-z]))(?=(.*\d))(?=(.*[)(*&^%$#@!)])).*$/;
function chkPwd(str) {
return reg.test(str);
}
function matchPwd(str) {
return str.match(reg);
}
let pwd = "df!AgHGFD$#1";
console.log(chkPwd(pwd));
console.log(matchPwd(pwd));
结果如下,match
是完整匹配的串,之后的元素则是与断言表达式匹配的部分

千位分隔符
给定一个整数,从个位开始每三位用逗号分隔
前瞻断言:匹配一个 13 位数,当且仅当它后面以三位数重复 0n 次作为结尾
- (?=(\d{3})+$):三位数重复 1~n 次作为结尾,使用 * 会在最后多加一个分隔符
- \d{1,3}: 匹配一个 1~3 位数
插入:使用 replace()
- 参数二 ‘$&’ 代表匹配项,’$&,’ 即在原匹配项后加入分隔符
function thousandNum(num) { var regx = /\d{1,3}(?=(\d{3})+$)/g; return (num + "").replace(regx, "$&,"); // $&表示与regx相匹配的字符串}
RGB 颜色提取
给定一串文本,从中提取出所有的 RGB 颜色代码
const RGB = function (str) {
let regExp = /#([0-9a-f]{6}|[0-9a-f]{3})/gi;
return str.match(regExp);
};
let color = "I need #FFad12, #fff, #000";
console.log(RGB(color));
// ['#FFad12', '#fff', '#000']
URL 参数提取
这里使用到了惰性量词
let params = function (url) {
url += "&";
let reg = /(?<=(\?|&))(.*?)(?=&)/g;
return url.match(reg);
};
let res = params("https://chrischen0405.github.io/?a=2018&b=11/09&c=tools1");
console.log(res);
// ["a=2018", "b=11/09", "c=tools1"];