正则表达式使用总结

正则学习模拟网站:https://regexr.com/
正则语义
基本格式  / ^     $/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-\u9fa5\w\-\/\.]{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 (/^(0\d{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-Z\u4e00-\u9fa5][\u4e00-\u9fa5\w\-\_\/\.]{0,64}$/.test(t))
    },
    /** 
     * @name 验证规则,8~32位字符,英文、数字和符号必须同时存在,符号仅限!@#$%^*()
     * @param {String} t 需要验证的值
     */
    adminPassword: (t) => {
        return (/[!@#$%^*()]/.test(t) && /^[a-zA-Z\d!@#$%^*()]+$/.test(t))
    },
    /** 
     * @name 验证规则,手机号规则
     * @param {String} t 需要验证的值
     */
    isMobile: (t) => {
        return (/^(1[3-9][0-9])\d{8}$/.test(t) && /^[a-zA-Z\d!@#$%^*()]+$/.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);  //小黑啊,小黑啊,你是小黑
posted @ 2019-05-01 22:46  huihuihero  阅读(321)  评论(0编辑  收藏  举报