正则语义
基本格式 / ^ $/g (^以什么开始,$以什么结束,g全局模式)
^ 表达式以什么开始,或者是取非(取反)
^[0-9] 以数字开头
^[a-z] 以小写字母开始
[^0-9] 取反,非数字
[^a-z] 非小写字母
$ 表达式以什么作为结尾 /^d{6}$/ 6位数字的验证码
g 全局
i 忽略大小写 (看下面例子)
. 任意字符 如 /./g
转义 如/3.14/g
w 阿拉伯数字,大小写字母,下划线均可匹配( 1~9 a~z A~Z _ )
W w的补集
d 仅匹配数字
D d的补集
s 匹配所有空白,如换行,空格,tab
S s补集
[adqu] a d q u四个字母均可匹配
[a-k] a-k之间的字母均可匹配
[1-6] 1-6之间的数字均可匹配
[A-K] A-K之间的字母均可匹配
[u4e00-u9fa5] 匹配所有汉字 这是Unicode编码
yo+ o可出现一次或多次 即yoo yooooo均可匹配
栗子: /[yY][oO]+/g 匹配yoO YoOO YoOo yooo等
yo* o可出现零次或多次
栗子: /[yY]o+[~!.]*/ 分解: [yY] yY均可匹配 ; o+ o,oo,ooo等均可匹配 ; [~!.]* 零个或多个~!.等均可匹配 栗子功能,可匹配yooo~~ Yoo Yoo. 等
yo? o可出现零次或一次
yo{1,4} o可出现1次到4次(自定义重复次数)
yo{3} 只匹配o出现3次的
yo{3,} o可出现3次到多次
(.+) ()表示分组
提取正则表达式里的组
提取日期里的月份
var str="2018-11-16";
var array=str.match(/(d{4})[-](d{2})[-](d{2})/g); //一个()代表一个组
console.log(array); //["2018-11-16"]
//正则表达式对象.$2 表示提取正则表达式的第2组
console.log(RegExp.$2); // 11
将所有h或H替换成S
var str="HhpphH";
str=str.replace(/[h]/gi,"S"); // g全局,i忽略大小写 等同于/[hH]/g
console.log(str); //SSppSS
创建正则表达式对象
//对象创建完毕---
var reg=new RegExp(/^d{5}$/);
//字符串
var str="10086";
//调用方法验证字符串是否匹配
var flag=reg.test(str);
console.log(flag);
字面量的方式创建正则表达式对象
var reg=/d{1,5}/;
var flag=reg.test("8884");
console.log(flag);
正则验证IP地址
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>demo</title>
<link rel="stylesheet" href="../../css/lib/bootstrap.min.css">
</head>
<body>
<div>
<input type="text" class="form-control form-control-sm" placeholder="ipv4格式,例:192.168.2.56" id="isitIP">
<span class="text-danger" id="isornotIP"></span>
</div>
<script>
isitIP.oninput=function(){
function isNull(param){
return !param && param!==0 && typeof param!=="boolean"?true:false;
}
function isIP(strIP){
if (isNull(strIP)){
return false;
}
var re=/^(d+).(d+).(d+).(d+)$/g;
if(re.test(strIP)){
if( RegExp.$1 <256 && RegExp.$2<256 && RegExp.$3<256 && RegExp.$4<256) return true;
}
return false;
}
var e=this.value;
var result=isIP(e);
if(result){
document.getElementById("isornotIP").innerText="";
}else{
document.getElementById("isornotIP").innerText="ipv4格式不符合要求";
}
if(e==""){
document.getElementById("isornotIP").innerText="请输入对应记录值";
}
}
</script>
</body>
</html>
封装正则验证函数便于调用
const RULE = {
/**
* @name 验证端口规则,例如:8080,1-65535,或all
* @param {String} t 需要验证的值
*/
portRange: (t) => {
if ("all" === t.toLowerCase()) return !0;
var a = (e) => {
return /[1-9]{1,5}/.test(e) && e <= 65535
};
if (-1 === t.indexOf("-")) return a(t);
var i = t.split("-");
return a(i[0]) && a(i[1]) && +i[0] < +i[1]
},
/**
* @name 验证IP范围规则,例如:180.76.1.0/24,或180.76.1.0,或all(所有IP)
* @param {String} t 需要验证的值
*/
remoteIP: (t) => {
if ("all" === t.toLowerCase()) return !0;
var n = convertCidrToBinary(t),
d = t.split("/")[1] || 32;
if (n.substring(+d, n.length).indexOf("1") > -1) return !1;
return new RegExp(RULE.IP_CIDR).test(t)
},
/**
* @name 验证公钥,必须含有ssh-rsa
* @param {String} t 需要验证的值
*/
sshRsa: (t) => {
return (/^ssh-rsa/.test(t))
},
/**
* @name 验证规则,大小写字母、数字以及-_/.特殊字符,必须以字母开头,长度1-65
* @param {String} t 需要验证的值
*/
name65: (t) => {
return (/^[a-zA-Z][w-/.]{0,64}$/.test(t))
},
/**
* @name 验证规则,大小写字母、数字、中文以及-_/.特殊字符,必须以字母开头,长度1-65
* @param {String} t 需要验证的值
*/
nameCn65: (t) => {
return (/^[a-zA-Z][u4e00-u9fa5w-/.]{0,64}$/.test(t))
},
/**
* @name 验证规则,大小写字母、数字,长度8-19
* @param {String} t 需要验证的值
*/
IDnumber19: (t) => {
return (/^[a-zA-Z][u4e00-u9fa5]{8,19}$/.test(t))
},
/**
* @name 验证规则,中文,长度1-40
* @param {String} t 需要验证的值
*/
Cn40: (t) => {
return (/^[u4e00-u9fa5]{1,40}$/.test(t))
},
/**
* @name 验证规则,英文,长度1-200
* @param {String} t 需要验证的值
*/
En200: (t) => {
return (/^[a-zA-Z]{1,200}$/.test(t))
},
/**
* @name 验证规则,数字,长度6
* @param {String} t 需要验证的值
*/
pcode: (t) => {
return (/^d{6}$/.test(t))
},
/**
* @name 验证规则,座机区号;
* @param {String} t 需要验证的值
*/
zone: (t) => {
return (/^(0d{3})$/.test(t))
},
/**
* @name 验证规则,座机号;
* @param {String} t 需要验证的值
*/
zonenub: (t) => {
return (/^d{7}$/.test(t))
},
/**
* @name 验证规则,大小写字母、数字、中文以及-_/.特殊字符,必须以字母开头,长度1-65
* @param {String} t 需要验证的值
*/
nameCnUndefault65: (t) => {
return (/^(?!default)[a-zA-Zu4e00-u9fa5][u4e00-u9fa5w-\_/.]{0,64}$/.test(t))
},
/**
* @name 验证规则,8~32位字符,英文、数字和符号必须同时存在,符号仅限!@#$%^*()
* @param {String} t 需要验证的值
*/
adminPassword: (t) => {
return (/[!@#$%^*()]/.test(t) && /^[a-zA-Zd!@#$%^*()]+$/.test(t))
},
/**
* @name 验证规则,手机号规则
* @param {String} t 需要验证的值
*/
isMobile: (t) => {
return (/^(1[3-9][0-9])d{8}$/.test(t) && /^[a-zA-Zd!@#$%^*()]+$/.test(t))
},
/**
* @name 验证规则,邮箱规则
* @param {String} t 需要验证的值
*/
}
调用:
$("#exampleName").on("input",function(){
if(RULE.name65(this.value)){
$(this).siblings("span").text("");
}else{
$(this).siblings("span").text("名称不符合规则:支持大小写字母、数字以及-_ /.特殊字符,必须以字母开头,长度1-65");
}
if($(this).val()==""){
$(this).siblings("span").text("");
}
})
利用正则表达式匹配相应数据,用到match方法
var str="中国移动:10086,中国联通:10010,中国电信:10000";
//把里面所有的数字全部显示出来
var arr=str.match(/d{5}/g);
console.log(arr); //打印出 ["10086","10010","10000"]
注释:match()方法
match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。
用法:
stringObject.match(searchvalue)
stringObject.match(regexp)
返回的是存放匹配结果的数组。该数组的内容依赖于 regexp 是否具有全局标志 g。没有g就不会全局匹配,结果会不准确
利用正则表达式替换字符串里的数据,用到replace方法
var str="大黄啊,大黄啊,你是大黄";
str=str.replace(/大黄/g,"小黑");
console.log(str); //小黑啊,小黑啊,你是小黑