常用正则
字符统计次数
var str1 = 'Hello world! My name is Chang Zhenan';
var reg1 = /(?!\s)[a-z]/ig;
var ary = [], newAry = [], obj = {};
str1.replace(reg1, function (a) {
var cur = a.toLowerCase();
obj[cur] ? obj[cur]++ : obj[cur] = 1
});
for (var key in obj) {
ary.push(obj[key]);
}
var max = Math.max.apply(null, ary);
for (key in obj) {
if (obj[key] === max) {
newAry.unshift(key,max);
}
}
console.log(newAry);
从url里获取信息,保存到对象
url一般是这种格式var url = 'http://www.zhufengpeixun.cn/index.html?name=zxt&age=28&sex=1';
只需要匹配等号左右边的字段,且不能是[?\s&=]中的任何一个,也就是给单词设置了边界条件
function getInfoFormUrl(url) {
var obj = {}, reg = /([^? &=]+)=([^? &=]+)/g;
url.replace(reg, function (a, b,c) {
obj[b] = c;
});
return obj;
}
格式化时间
var template = '{0}年{1}月{2}日 {3}时{4}分{5}秒';
var time = '2017-3-26 18:38:4';
var timeAry = time.split(/[- :]/g);
var reg = /\{\d\}/g;
var count = 0;
template = template.replace(reg, function () {
return timeAry[count++];
});
模拟Trim()
var str2 = ' my name is czn ';
String.prototype.myTrim = function myTrim() {
return this.replace(/^\s*|\s*$/g, '');
};
千分符
千分符是在整数部分从后往前数,每三位前加一个逗号
思路就是捕获字符串中一些具有一定特性的数字,这些数字后的整数部分位数可以被3整除(直到结尾,或者是以小数结束)
var str4 = '21345633451.23';
var reg4 = /\d(?=(?:\d{3})+(?:\.\d+|$))/g;
str4 = str4.replace(reg4, function (a) {
return a + ',';
});
console.log(str4);//-->21,345,633,451.23
手机号
var reg = /^1\d{10}$/;
比较正规的
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
身份证
- 18位,前17位是数字,最后一位是数字或者X
- 前6位:省市县
- 第7位到第14位,出生年月日,
- 最后4位是顺序随机码,倒数第二位代码性别
var str = '130133199102120031';
var reg = /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(?:\d|X)$/;
console.log(str.match(reg))//-->["130133199102120031", "130133", "1991", "02", "12", "3", index: 0, input: "130133199102120031"]
这样获得分组,可以利用其中的有效信息,帮用户自动填写一些信息,提高用户体验
验证是否为有效数字
- 正数或负数:可以以+或者-开头,或者没有任何符号开头
- 整数或小数(如果是小数的话,必须有
.
且之后必须有数字) - 整数不能以0开头
(\d|[1-9]\d+)
一位数字或者多位数
var reg = /^[+-]?(/d|([1-9]\d+))(\.\d+)?$/;
//或者
var reg2 = /^(\+|-)(/d|([1-9]\d+))(\.\d+)?$/;
验证中文
二到四位中文
var reg = /^[\u4e00-\u9fa5]{2,4}$/;
用户昵称
- 可以由数字、字母、下划线、汉字组成
- 最长是14个英文字母或7个汉字(汉字占两个字节,也就是14个字节)
function checkNick(nick) {
var reg1 = /^[\u4e00-\u9fa5]$/,//检测是否中文
reg2 = /^\w$/;//检测是否为数字、字母、下划线
var len = null;
for (var i = 0; i < nick.length; i++) {
var cur = nick[i];
if (reg1.test(cur)) {
len += 2;
} else if (reg2.test(cur)) {
len++;
} else {
len = 0;
break;
}
}
if (len === 0 || len > 14) {
return false;
}
return true;
}
验证数字
- 18-65年龄
可以分成三段来做
- 1[8-9]
- [2-5]\d
- 6[0-5]
var reg = /^((1[8-9])|([2-5]\d)|(6[0-5]))$/;
邮箱
var reg = /^\w+((-\w+)|(\.\w+))*@[0-9a-zA-Z]+(\.|-[0-9a-zA-Z]+)*\.[0-9a-zA-Z]+$/;
网上找的邮箱
var reg2 = /w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* /
vue中的
var emailRE = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
非空验证
主要学习两个事件,一个失去光标,一个实时监听
user.oninput = validVal;//实时监听
user.onblur = validVal;//失去光标
function validVal() {
var regs = /^\s*$/g;
if (regs.test(this.value)){
info.style.display = 'block';
} else {
info.style.display = 'none';
}
}
匹配时间
23:45格式
var reg = /\b([01]?\d|2[0-3]):([0-5]\d)\b/;
匹配IP
var reg = /^(?!0+.0+.0+.0+$)(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.(?:[01]?\d\d?|2[0-4]\d|25[0-5])$/;
双字节字符
应用:可以计算一个字符串的长度,用正则匹配双字节,然后用aa替换
String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;}
利用正则表达式限制网页表单里的文本框输入内容
用正则表达式限制只能输入中文:
onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'') "onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^u4E00-u9FA5]/g,''))"
用正则表达式限制只能输入全角字符:
onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'') "onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^uFF00-uFFFF]/g,''))"
用正则表达式限制只能输入数字:
onkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste= "clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^d]/g,''))"
用正则表达式限制只能输入数字和英文:
onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^d]/g,''