天天看點

正規表達式學習使用筆記整理

正規表達式一般來說分為正向正規表達式和逆向正規表達式

正規表達式可以實作字元串比對的功能,它采用一定的政策進行比對,在有貪婪模式的情況下,正則會優先比對能比對的最大值,然後再以步退的模式向前疊代,直到整句正規表達式完全比對為止,可以看出,在有貪婪模式的正則中,時間複雜度是比較高的,是以在比對環境中最好避免大量使用貪婪模式。

正規表達式複雜度測試工具:

線上練習正規表達式:​​​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;
        }
    };      

繼續閱讀