年龄段

匹配 18 - 65 的年龄段:

分段匹配:
18-19
20-59
60-65

  1. //=> 小括号可以不用,只是用于捕获
  2. var reg = /^(1[89])|([2-5]\d)|(6[0-5])$/

匹配 [object xxx]

中括号由于具有特殊含义,需要进行转义

  1. let reg = /^\[object .+\]$/

有效数字

  1. 正数 负数 零

  2. 小数 整数

分析规则:

  1. 可以出现正负号,可以没有,也可以有一个

  2. 整数:一位或者多位,0-9,多位数字不能以 0 开头

  3. 小数部分:可能有可能没有,有小数点后面至少跟一位数字

  1. let reg = /^[+-]?(\d|[1-9]\d+)(\.\d+)?$/;

千分位分割

需要实现下列情形:

  • 1,234,567

  • 12,345,678

  • 123,456

思路:

  • 捕获所有需要在后面加 , 号的数字,将其替换为 本身加 , 号

  • 捕获一个数字,后面带有三的倍数个数字

  • 后面可以有或者没有小数结尾

匹配某个数字,后面带有 3 的倍数个数字,后面可能有小数,并以此结尾

  1. let reg = /(\d)(?=(\d{3})+(\.\d+)?$)/g
  2. money.replace(reg, '$1,')

手机号

中国:

  1. 11位数

  2. 以 1 开头

  1. let reg = /^1\d{10}$/;

中文姓名

  1. 中文汉字 [\u4E00-\u9FA5]

  2. xxx · xxx

  1. let reg = /^[\u4E00-\u9FA5]{2,}(·[\u4E00-\u9FA5]{2,})?$/

邮箱

xxx@xxx.xxx.xxx.xx @email.szu.edu.cn,@后面还可以是 IP 地址,前面可以是中文等

  1. 第一部分:数字、字母、下划线、-.,但是中杠和点不能开头,不能连续出现,所以出现的时候,后面必须跟着其他字符

  2. 第二部分:域名的名字只能是数字和字母

最简单:

  1. /.+@.+/
  1. let reg = /^\w+([-.]\w+)*@[a-zA-Z0-9]+([-.][a-zA-Z0-9]+)*\.[a-zA-Z0-9]+$/

身份证信息

公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

地址码
表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。

出生日期码
表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。

顺序码
表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

校验码
根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。

身份证信息的规律:

  • 18 位

  • 前六位是省市区

  • 中间八位是出生年月日

  • 后面三位是顺序码,顺序码中最后一位是偶数是女,奇数是男

  • 最后一位是校验码

需求:
根据身份证号码,展示出这个人的基本信息:
xxxx年xx月xx日出生,性别xx

用正则编写的思路:

  • 匹配整个字符串,在正则中把需要的信息加进分组中

  • 捕获分组信息

  • 把分组信息拼接成想要的结果

  1. var reg = /^\d{6}(\d{4})(\d{2})(\d{2})\d{2}(\d)[\dX]/;
  2. var str = '130425199001271013';
  3. //=> 使用 match
  4. var ary = str.match(reg);
  5. var str2 = `${ary[1]}年${ary[2]}月${ary[3]}日出生
  6. 性别:${ary[4]%2 === 0? "女" : "男"}`;
  7. console.log(str2);
  8. //=> 使用 replace
  9. var str3 = str.replace(reg, function() {
  10. var ary = [...arguments];
  11. return `${ary[1]}年${ary[2]}月${ary[3]}日出生
  12. 性别:${ary[4]%2 === 0? "女" : "男"}`;
  13. });
  14. console.log(str3)

时间字符串格式化

通过正则,把下面的日期字符串转化为对应的汉字的年月日时间

  1. var str = "2018/08/08 12:24:34"
  2. //=> split
  3. var reg = /[\/ :]/g; //=> 注意的是 / 后面不能直接接 -,都需要进行转义
  4. var ary = str.split(reg);
  5. var str2 = `今天是${ary[0]}年${ary[1]*1}月${ary[2]*1}日 ${ary[3]< 10 ? "上午":(ary[3] < 14? "中午" : "下午")}${ary[3]}点${ary[4]}分${ary[5]}秒`;
  6. //=> replace
  7. var reg = /(\d+)[\/-](\d+)[\/-](\d+) (\d+):(\d+):(\d+)/
  8. var str4 = str.replace(reg, function(...ary) {
  9. return `今天是${ary[1]}年${ary[2]*1}月${ary[3]*1}日 ${ary[4]< 10 ? "上午":(ary[4] < 14? "中午" : "下午")}${ary[4]}点${ary[5]}分${ary[6]}秒`
  10. });
  11. //=> match
  12. var reg = /(\d+)\/(\d+)\/(\d+) (\d+):(\d+):(\d+)/
  13. var ary = str.match(reg);
  14. var str4 = `今天是${ary[1]}年${ary[2]*1}月${ary[3]*1}日 ${ary[4]< 10 ? "上午":(ary[4] < 14? "中午" : "下午")}${ary[4]}点${ary[5]}分${ary[6]}秒`;

复用方法:

  1. //=> 1. 获取时间字符串中所有的数字
  2. //=> 只需要匹配数值,不管什么分隔符,使用 match 方法
  3. let reg = /(\d+)/g;
  4. let ary = str.match(reg).map((item) => {
  5. return item < 10 ? '0' + item : item;
  6. }); //=> map 相对于 forEach 来说多了返回值,函数中返回的是啥,就把当前数组中迭代的这一项替换成啥
  7. //=> 2. 指定最后想要的时间格式,我们基于这个数组的内容,帮你拼接好即可
  8. let template = '{0}年{1}月{2}日 {3}时{4}分{5}秒'
  9. template = template.replace(/\{(\d)\}/g, (...arg){
  10. return ary[arg[1]];
  11. })

URL 问号参数

  1. var str = "https://www.souyidai.com/soeasy/invest/onlinelist?productType=1&pageNo=0&repayMode=-1&orderBy=DEFAULT&t=0.642114887216358";
  2. /* 获取字符串中的参数 */
  3. var reg = /[^?=&]+=[^?=&]+/g;
  4. var ary = str.match(reg);