正则表达式一般来说分为正向正则表达式和逆向正则表达式

正则表达式可以实现字符串匹配的功能,它采用一定的策略进行匹配,在有贪婪模式的情况下,正则会优先匹配能匹配的最大值,然后再以步退的模式向前迭代,直到整句正则表达式完全匹配为止,可以看出,在有贪婪模式的正则中,时间复杂度是比较高的,所以在匹配环境中最好避免大量使用贪婪模式。

正则表达式复杂度测试工具:正则表达式学习使用笔记整理_正则表达式
在线练习正则表达式:​​​https://regex101.com/​

1、匹配ip地址
ip地址最大的特点就是具有重复性,所以只需要确定某一个的正则就行,ipv4最大值为255,所以我们每一项都需匹配小于255的情况,于是正则转换为 用正则实现小于等于255:

一位数和二位数 \d{1,2}
三位数:((1\d{2})|(2[0-4]\d)|(25[0-5]))
合起来就是 (^|\s)(((\d{1,2})|((1\d{2})|(2[0-4][0-9])|(25[0-5])))\.){3}((\d{1,2})|((1\d{2})|(2[0-4][0-9])|(25[0-5])))(\s|$)

2、任意值一般写法

[a-zA-Z0-9_-]+

3、匹配首尾的写法

(^|\s)(\s|$)

4、数字大小匹配

小于15:
不包含负数
(^|\s)(\d|(1[0-5]))(\s|$)
包含负数的版本
(^|\s)(\d|(1[0-5])|(-\d+))(\s|$)
大于90
(^|\s)(9[1-9]|\d{3,})(\s|$)

数字匹配枚举所有可能的情况就行了

5、| 语句的每一种并列的情况都需要单独用括号括起来
错误实例

匹配配置 ospf shutdown , http shutdown , ssh shutdown 都可以
正则为:(^|\s)ospf|http|ssh\s+shutdown(\s|$)
匹配的结果为: ospf ,http,ssh shutdown

这样的匹配结果跟 | 符号的优先级有关,| 符号的优先级比较低,+号比较高,所以ssh\s+shutdown会被认为是一起的,应该将上面的正则修改为

匹配配置 ospf shutdown , http shutdown , ssh shutdown 都可以
正则为:(^|\s)(ospf|http|ssh)\s+shutdown(\s|$)
匹配的结果为:ospf shutdown , http shutdown , ssh shutdown

6、一些特殊字符需要进行转义

. => \.
+ => \+
- 不需要转义 -
$ => \$
^ => \^

7、常备(搬运工日常存储)

var validator = {

isCookie: function (str) {
//var reg = /(?is);?([\w\W]+?)=([\w\W]+?)(?=(;|,))/;
//var reg = /(^| )id=([^;]*)(;|$)/;
var reg=/([A-Za-z])=([A-Za-z0-9_]+)$/;
if (reg.test(str)) {
return true;
} else {
return false;
}
},

isURL: function (str) {
//var reg = /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?$/;
var reg = /^((http|https)?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?$/;
if (reg.test(str)) {
return true;
} else {
return false;
}
},

isURL1: function (str) {
var reg = new RegExp(
"^" +
// protocol identifier
"(?:(?:https?|ftp)://)" +
// user:pass authentication
"(?:\\S+(?::\\S*)?@)?" + "(?:" +
// IP address dotted notation octets
// excludes loopback network 0.0.0.0
// excludes reserved space >= 224.0.0.0
// excludes network & broacast addresses
// (first & last IP address of each class)
"(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" +
"(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" +
"(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" +
"|" +
// host name
"(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)" +
// domain name
"(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)" +
// TLD identifier
"(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))" +

")" +

"(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))?" +

// port number
"(?::\\d{2,5})?" +
// resource path
"(?:/\\S*)?" + "$", "i" );

if (reg.test(str)) {
return true;
} else {
return false;
}
},


isHTTP: function (str) {
//var reg = /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?$/;
var reg = /^((http)?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?$/;
if (reg.test(str)) {
return true;
} else {
return false;
}
},

isHTTPS: function (str) {
//var reg = /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?$/;
var reg = /^((https)?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?$/;
if (reg.test(str)) {
return true;
} else {
return false;
}
},



isDNAddress: function (str) {
var reg = /^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/;
if (reg.test(str)) {
return true;
} else {
return false;
}
},


isIPAddress:function (str) {
var reg=/((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))/;
if (reg.test(str)) {
return true;
} else {
return false;
}
},


isPassword:function (str) {
var reg= /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,}$/;
if (reg.test(str)) {
return true;
} else {
return false;
}
},

isPassword1:function (str) {
// var reg = /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}\[\]:";'<>?,.\/]).{8,20}$/;
var reg=/^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{8,20}$/;
if (reg.test(str)) {
return true;
} else {
return false;
}
},



isMail: function (str) {
var re = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/;
if (re.test(str)) {
return true;
} else {
return false;
}
},

isMails: function (str) {
var strs=str.split(";"); //字符分割
var flag=1;

for (var i=0;i<strs.length ;i++ ){
var reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/;
if (reg.test(strs[i])) {

} else {
return flag;
}
}
},




checkUser: function (str) {
var reg = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z_-]{6,20}$/;
if (reg.test(str)) {
return true;
}
else {
return false;
}
},
isMoney: function (money) {
var reg = /^^([1-9]\d{0,9}|0)([.]?|(\.\d{1,2})?)$/;
if (!reg.test(money)) {
return false;
}
return true;
},
//非空验证
isNull: function (str) {
if ($.trim(str) === '') {
return false;
}
return true;
},
//字符串是否有空字符
isStringNull: function (str) {
var n_reg = /\s+/;
if (n_reg.test(str)) {
return false;
}
return true;
},
//验证字符范围
strLen: function (str, len, len2) {
if (str.length < len || str.length > len2) {
return false;
}
return true;
},
//密码比较
pwdCompare: function (str1, str2) {
if (str1 != str2) {
return false;
}
return true;
},
//带区号的
isTel: function (str) {
var reg = /^((0\d{2,3})-?)?(\d{7,8})(-(\d{3,}))?$/;
if (!reg.test(str)) {
return false;
}
return true;
},
//手机验证
isPhone: function (phone) {
var reg = /^1[3456789]{1}[0-9]{9}$/;
return reg.test(phone);
},

isPhones: function (str) {
var strs1=str.split(";"); //字符分割
var flag=1;
for (var j=0;j<strs1.length ;j++ ){
var reg = /^1[34578]{1}[0-9]{9}$/;
if (reg.test(strs1[j])) {

} else {
return flag;
}
}
},





isChecked:function (str) {
var name = document.getElementsByName(str);
var isSel = false;
for (var i = 0; i < name.length; i++) {
if (name[i].checked == true) {
isSel = true;
break;
}
}
if (isSel == false) {
return false;
} else {
return true;
}
},
//密码强度
checkStrong: function (sValue) {
/** 强度规则
+ ------------------------------------------------------- +
1) 任何少于6个字符的组合,弱;任何字符数的同类字符组合,弱;
2) 任何字符数的两类字符组合,中;
3) 12位字符数以下的三类或四类字符组合,强;
4) 12位字符数以上的三类或四类字符组合,非常好。
+ ------------------------------------------------------- +
**/
var modes = 0;
if (sValue.length < 6)
return modes;
if (/\d/.test(sValue))
modes++; //数字
if (/[a-z]/.test(sValue))
modes++; //小写
if (/[A-Z]/.test(sValue))
modes++; //大写
if (/\W/.test(sValue))
modes++; //特殊字符
switch (modes) {
case 1:
return 1;
break;
case 2:
return 2;
break;
case 3:
if (sValue.length >= 12) {
return 4;
}
return sValue.length > 10 ? 3 : 2;
break;
case 4:
return sValue.length > 12 ? 4 : 3;
break;
}
},
//15位和18位身份证号码的正则表达式
isIdCard: function (idCard) {
var regIdCard = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
return regIdCard.test(idCard);
},
//6位验证码
isCode: function (str) {
if (!this.v_str_s(str))
return false;
var reg1 = /^\d{6}$/;
if (!reg1.test(str))
return false;
return true;
}
};