正規表達式一般來說分為正向正規表達式和逆向正規表達式
正規表達式可以實作字元串比對的功能,它采用一定的政策進行比對,在有貪婪模式的情況下,正則會優先比對能比對的最大值,然後再以步退的模式向前疊代,直到整句正規表達式完全比對為止,可以看出,在有貪婪模式的正則中,時間複雜度是比較高的,是以在比對環境中最好避免大量使用貪婪模式。
正規表達式複雜度測試工具:
線上練習正規表達式: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
. => \.
+ => \+
- 不需要轉義 -
$ => \$
^ => \^
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;
}
};