正则表达式

正则表达式的概念:我们在处理数据的时候,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的语法。

正则表达式的主要作用是分割、匹配、查找、替换。

正则表达式不仅可以帮助我们完成一些通过函数无法实现的工作,还可以帮助我们减轻很多工作量。

 

正则表达式的定义方法:方式一:/规则/匹配成功返回TRUE ,

           方式二:new RegExp(字符串);

1  var str = "一统大业123满城风絮456";
2 
3 
4     var r = /123/;
5 
6     var reg = new RegExp("123");
7 
8     alert(r.test(str))    //弹窗为TRUE
9     //alert(reg.test(str))

\为转译符号

特殊字符:

特殊字符
    *
    *       \n  \r \t
    *
    *       \d  数字
    *       \D  非数字
    *       \s  空格
    *       \S  非空格
    *       \w  字符(数字、字母、_)
    *       \W  非字符(不是\w的都是匹配内容)
    *
    *       \b  单词边界   起始  结束  连词符(除了\w  其他的都属于连词符)  (独立的部分)
    *       \B  非独立部分

 

 

量词:满足匹配规则字符的数量。reg=/1{1,5}/匹配最少1次最多5次,如果有5次则匹配5次。默认为贪婪匹配

有几种特殊写法
* {0,1}      ? 最少0次 最多1次
* {1,}    + 最少1次 最多无限
* {0,}   * 不限制,可以任意次

 

 

贪婪匹配和非贪婪匹配
  * 贪婪匹配会先以最多的次数来进行匹配
  * 例如:
  * "11111222333".replace(/1{4,6}?/,"A")
  输出:"A222333"

  非贪婪匹配
    写法 量词? {}?
    以量词里最少次数开始匹配

 

范围词【】:

 1 var str = "aAbBcC"; 2 var reg = /[A-Z]/g; 3 console.log(str.match(reg)) 

 

标识符:

* g global 全局
* i ignore case 不区分大小写
* m multiline 换行匹配
*
* 写在第二个/后面

 

子集:

 1    /*
 2     *
 3     *       ()
 4     *       子集  一个整体
 5     *
 6     *       {}如果量词前面不是子集那么只管前面一个字符
 7     *
 8     * */
 9 
10 
11     var str = "12121212";
12 
13     var reg = /(12){2,5}/g;
14 
15 
16     console.log(str.match(reg))

 

 

str.match()的使用:返回一个数组,包含着匹配内容的一个数组,如果匹配不成功就是返回null,返回的是null,而不是空数组。

ps:Array.isArray(检测对象)判断一个对象是不是数组是 返回 true不是 返回 false

 1  var reg = /222/;
 2 
 3 
 4     var str = "方当111";
 5 
 6     var arr = str.match(reg);
 7 
 8 
 9     console.log(arr);
10 
11 
12     alert(Array.isArray(arr));

 

回顾:

 1 回顾:
 2     *
 3     *   特殊字符
 4     *       \  /  {}  ()  []  +  ?  *   {}?  +?  *?  ??  |
 5     *
 6     *
 7     *   元字符
 8     *       \d   数字
 9     *       \w   字符(字母,数字,_)
10     *       \s   空格
11     *       \b   单词边界  独立部分  连词符(除了\w以外的都是)
12     *
13     *      给上面对应的取反
14     *       \D
15     *       \W
16     *       \S
17     *       \B
18     *
19     *   标识
20     *       g   全局
21     *       m   换行匹配
22     *       i   不区分大小写
23     *
24     *
25     *   str.match(reg)
26     *       把正则匹配的内容,返回一个新的数组
27     *
28     *
29     *   reg.test(str)
30     *       在str去匹配reg的规则,有则返回 true   没有就返回false
31     *
32     *   str.replace(reg,str2(function))
33     *       第二个参数如果是str
34     *           则把正则匹配的部分替换为str2
View Code

replace:

 1   replace()    除了可以是字符串,还可以是function
 2     *
 3     *          正则没有子集的时候:
 4         *           第二个参数是函数的函数的时候
 5         *               函数的第一个形参
 6         *                   正则匹配到的内容
 7         *               第二个形参:
 8         *                   是每次匹配到的结果对应的索引
 9         *               第三个形参:
10         *                   是正则匹配的目标str本身
11     *
12     *
13     *
14     *           如果正则里有子集的时候:
15     *               函数的第一个参数:
16     *                   是正则每次匹配到的内容
17     *               第二个参数
18     *                   对应第一个子集
19     *               第三个
20     *                   对应第二个子集
21     *               以此类推
22     *
23     *               最后一个参数
24     *                   是每次匹配的内容在目标字符串里的下标

  

 1  var str = "A1A1A1A1";
 2 
 3     var reg = /(A1)/g;
 4 
 5     var a = str.replace(reg,function (a,b,c) {
 6         console.log(b);
 7         console.log(c);
 8         return a+"X";
 9         
10     });
11 
12 
13     console.log(a)
14     console.log(str)

 

 

案例:

1.用正则过滤脏字:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="Author" content="FengYu">
    <title>Tz-34期Js</title>
    <style>
        *{margin:0;padding:0;font-family: Microsoft YaHei,serif;}
        li{list-style: none;}
        .time{
            display: block;
            color:#999;
        }
    </style>
    <script src="https://git.oschina.net/cx-fy/personal/raw/master/conmenu.js"></script>
</head>
<body>
<input type="text" id="input">
<input type="button" id="btn" value="发送">
<ul>
    <!--<li><span class="time">22:00</span><span class="txt">傻逼</span></li>-->
</ul>

<script>
    
    var inp1 = document.getElementById("input"),
        btn = document.getElementById("btn"),
        oUl = document.getElementsByTagName("ul")[0],
        reg = /傻.{0,3}逼/;
        
        
        btn.onclick=function () {
            var val = inp1.value;
            if(val){
                val = val.replace(reg,function (a) {
                    var str = "";
                    for(var i=0,length=a.length;i<length;i++){
                        str += "*";
                    }
                    return str;
                });

                var data = new Date(),
                    //获取时分秒
                    hh = data.getHours(),
                    mm = data.getMinutes(),
                    ss = data.getSeconds();

                //给时分秒加上0
                hh = addZero(hh);
                mm = addZero(mm);
                ss = addZero(ss);

                var timer = hh+":"+mm+":"+ss;

                var oLi = document.createElement("li");
                    oLi.innerHTML = '<span class="time">'+timer+'</span><span class="txt">'+val+'</span>'

                oUl.appendChild(oLi);
                inp1.value = "";
            }


        };


        function addZero(n) {
            return n<10?"0"+n:n+"";
        }

</script>
</body>
</html>
View Code

 

2.商用正则表达式:

 1 var reg = {
 2         qq : /^[1-9]\d{4,9}$/,   //匹配qq号
 3         pwd : /^[\w!@#$%^&*\[\](){}\\/\-\.]{6,20}$/,  //密码
 4         user : /^[a-zA-Z_]\w{5,17}$/,  //用户名
 5         email : /^[1-9a-zA-Z]\w{5,17}@[1-9a-z]{2,7}\.[a-z]{2,4}$/,  //电子邮箱
 6         tel : /^1[3-8]\d{9}$/,  //手机号
 7         idCard : /^[1-9]\d{5}[12][90]\d{2}[01]\d[0-3]\d\d{3}[\dxX]$/,  //身份证
 8         url : /^(http|https):\/\/[^@\S]*$/   //网址
 9     };
10 
11     var str = "http://www.baidu.com/@";
12     alert(reg.url.test(str))

 

posted @ 2018-04-11 13:43  PaiPai_hu  阅读(126)  评论(0编辑  收藏  举报