年龄段
匹配 18 - 65 的年龄段:
分段匹配:
18-19
20-59
60-65
//=> 小括号可以不用,只是用于捕获
var reg = /^(1[89])|([2-5]\d)|(6[0-5])$/
匹配 [object xxx]
中括号由于具有特殊含义,需要进行转义
let reg = /^\[object .+\]$/
有效数字
正数 负数 零
小数 整数
分析规则:
可以出现正负号,可以没有,也可以有一个
整数:一位或者多位,0-9,多位数字不能以 0 开头
小数部分:可能有可能没有,有小数点后面至少跟一位数字
let reg = /^[+-]?(\d|[1-9]\d+)(\.\d+)?$/;
千分位分割
需要实现下列情形:
1,234,567
12,345,678
123,456
思路:
捕获所有需要在后面加 , 号的数字,将其替换为 本身加 , 号
捕获一个数字,后面带有三的倍数个数字
后面可以有或者没有小数结尾
匹配某个数字,后面带有 3 的倍数个数字,后面可能有小数,并以此结尾
let reg = /(\d)(?=(\d{3})+(\.\d+)?$)/g
money.replace(reg, '$1,')
手机号
中国:
11位数
以 1 开头
let reg = /^1\d{10}$/;
中文姓名
中文汉字
[\u4E00-\u9FA5]
xxx · xxx
let reg = /^[\u4E00-\u9FA5]{2,}(·[\u4E00-\u9FA5]{2,})?$/
邮箱
xxx@xxx.xxx.xxx.xx @email.szu.edu.cn,@后面还可以是 IP 地址,前面可以是中文等
第一部分:数字、字母、下划线、
-
、.
,但是中杠和点不能开头,不能连续出现,所以出现的时候,后面必须跟着其他字符第二部分:域名的名字只能是数字和字母
最简单:
/.+@.+/
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
用正则编写的思路:
匹配整个字符串,在正则中把需要的信息加进分组中
捕获分组信息
把分组信息拼接成想要的结果
var reg = /^\d{6}(\d{4})(\d{2})(\d{2})\d{2}(\d)[\dX]/;
var str = '130425199001271013';
//=> 使用 match
var ary = str.match(reg);
var str2 = `${ary[1]}年${ary[2]}月${ary[3]}日出生
性别:${ary[4]%2 === 0? "女" : "男"}`;
console.log(str2);
//=> 使用 replace
var str3 = str.replace(reg, function() {
var ary = [...arguments];
return `${ary[1]}年${ary[2]}月${ary[3]}日出生
性别:${ary[4]%2 === 0? "女" : "男"}`;
});
console.log(str3)
时间字符串格式化
通过正则,把下面的日期字符串转化为对应的汉字的年月日时间
var str = "2018/08/08 12:24:34"
//=> split
var reg = /[\/ :]/g; //=> 注意的是 / 后面不能直接接 -,都需要进行转义
var ary = str.split(reg);
var str2 = `今天是${ary[0]}年${ary[1]*1}月${ary[2]*1}日 ${ary[3]< 10 ? "上午":(ary[3] < 14? "中午" : "下午")}${ary[3]}点${ary[4]}分${ary[5]}秒`;
//=> replace
var reg = /(\d+)[\/-](\d+)[\/-](\d+) (\d+):(\d+):(\d+)/
var str4 = str.replace(reg, function(...ary) {
return `今天是${ary[1]}年${ary[2]*1}月${ary[3]*1}日 ${ary[4]< 10 ? "上午":(ary[4] < 14? "中午" : "下午")}${ary[4]}点${ary[5]}分${ary[6]}秒`
});
//=> match
var reg = /(\d+)\/(\d+)\/(\d+) (\d+):(\d+):(\d+)/
var ary = str.match(reg);
var str4 = `今天是${ary[1]}年${ary[2]*1}月${ary[3]*1}日 ${ary[4]< 10 ? "上午":(ary[4] < 14? "中午" : "下午")}${ary[4]}点${ary[5]}分${ary[6]}秒`;
复用方法:
//=> 1. 获取时间字符串中所有的数字
//=> 只需要匹配数值,不管什么分隔符,使用 match 方法
let reg = /(\d+)/g;
let ary = str.match(reg).map((item) => {
return item < 10 ? '0' + item : item;
}); //=> map 相对于 forEach 来说多了返回值,函数中返回的是啥,就把当前数组中迭代的这一项替换成啥
//=> 2. 指定最后想要的时间格式,我们基于这个数组的内容,帮你拼接好即可
let template = '{0}年{1}月{2}日 {3}时{4}分{5}秒'
template = template.replace(/\{(\d)\}/g, (...arg){
return ary[arg[1]];
})
URL 问号参数
var str = "https://www.souyidai.com/soeasy/invest/onlinelist?productType=1&pageNo=0&repayMode=-1&orderBy=DEFAULT&t=0.642114887216358";
/* 获取字符串中的参数 */
var reg = /[^?=&]+=[^?=&]+/g;
var ary = str.match(reg);