原稿:语雀 · 正则表达式 · 原目录:手撕代码 › 正则表达式

更多可参考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])(?=.*[!@#$%^&*?]).*$/;
image.png

断言中的内容一般只是作为条件,不会出现在匹配的结果中,但如果将断言内容使用括号包裹,则断言表达式也会被捕获,可以使用 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

00

是完整匹配的串,之后的元素则是与断言表达式匹配的部分

image.png

千位分隔符

给定一个整数,从个位开始每三位用逗号分隔

前瞻断言:匹配一个 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"];