zoukankan      html  css  js  c++  java
  • 【总结】正则表达式的一些应用

    找出所有数字:

    var str ='1asdf,s42df,df456sdf';
    var re = /d+/g; // d数字
    console.log(str.match(re));

    校验年龄(18岁到100岁): 
    var re=/^(1[8-9]|[2-9]d|100)$/

    • |符号表示或
    • 这里分别用18到19,20到99,以及100进行了分组校验,用|来分割,但是这个符号的优先级很低,所以要把2次或的运算结果都计算出来后再加上^$

    座机号码验证: 
    可以有区号,区号0开头,区号可以3位可以4位,后面可以跟-或者不跟 
    var re=/^(0[1-9]d{1,2}-?)?[1-9]d{6,7}$/;

    • ^不能出现在()里,而要在外面
    • ?表明没有或者有1个
    • 不要忘了开始^$结尾

    邮箱校验: 
    比如alex@qq.com, 
    var re=/^w+@w+.[a-zA-Z]{1,3}(.[a-zA-Z]{1,2})?$/;

    • w单词英文数字下划线,相当于[a-zA-Z0-9_]
    • 最后可能会出现2个点,但是不会有3个点,所以最后一段是可有一个或者没有的,但是字数不超过2个

    合并2边的空格:

    var str=' i love you ';
    alert('|'+trim(str)+'|');
    function trim(s){
    return s.replace(/^s+|s+$/g,'');
    }

    合并中间空格:

    var str='i love you';
    //合并中间空格
    str=str.replace(/s+/g,' ');//方法一,把所有多余的空格都替换成1个空格
    str=str.match(/S+/g).join(' ');//方法二,把所有非空格的字符找出来放进数组再拼成string
    str=str.split(/s+/g).join(' ');//方法三

    校验中文: 
    var re=/^[u4e00-u9fa5]+$/ 
    中文字符十六位进制区间// 0x4e00----0x9fa5 
    用转义表示就是u4e00-u9fa5


    用正则来封装getByClass函数

    function getByClass(obj,sClass){
    if(obj.getElementsByClassName){
    return obj.getElementsByClassName(sClass);
    }
    var arr = obj.getElementsByTagName('*');
    var result = [];
    var re = new RegExp('\b' + sClass + '\b');
    for (var i=0; i<arr.length; i++) {
    if(re.test(arr[i].className)){
    result.push(arr[i]);
    }
    }
    return result;
    }

    注意点

    • 利用了正则的边界,但是这里为什么不能用perl的语法,而要用new RegExp的方式呢?是因为中间sClass是一个变量,无法写在perl语句中,perl中的字符串是不能加引号的
    • 而在js中单单写是一个转义,要在前面再加一个才行
    • 注意正则的test()方法是正则对象调用的,参数里放string,返回的是一个boolean
    • 这个方法效率是挺高,但是有bug,因为在正则中-符号也算是一个边界,这样导致active-one这样的类也会被选中,这个问题在jQuery中也有。所有为了正确性,还是推荐用原来封装的函数。

    仿jQuery的操作class

    //判断obj是否含有sClass类
    function hasClass(obj,sClass){
    var re=new RegExp('\b'+sClass+'\b');
    return re.test(obj.className);
    }
     
    //给obj添加sClass类
    function addClass(obj,sClass){
    var re=new RegExp('\b'+sClass+'\b');
    if(!re.test(obj.className)){
    obj.className += ' ' + sClass;
    }
    }
     
    //删除obj的sClass类
    function removeClass(obj,sClass){
    var re=new RegExp('\b'+sClass+'\b');
    if(re.test(obj.className)){
    obj.className = obj.className.replace(re,'');
    if(!obj.className){
    obj.removeAttribute('class'); //删除掉sClass之后再判断该obj的class是否为空,如果是,就把这个obj的class也删除
    }
    }
    if(obj.className){
    obj.className = obj.className.replace(/^s+|s+$/g,'').replace(/s+/g,' ');
    }
    //这段相当于再整理一下class,把前后的空格和中间的空格都去掉
    }
     
    //如果obj有sClass,就删除,否则就添加sClass
    function toggleClass(obj,sClass){
    hasClass(obj,sClass)?removeClass(obj,sClass):addClass(obj,sClass);
    }
  • 相关阅读:
    第一次Java作业
    第十一次作业
    第十次作业
    第九次作业
    第八次作业
    第七次作业
    第六次作业
    Java中数组自定义排序与优先级队列笔记
    力扣每日一题:删除链表的倒数第N个节点
    又一次离谱的错误——运算符优先级
  • 原文地址:https://www.cnblogs.com/bluefantasy728/p/5759005.html
Copyright © 2011-2022 走看看