zoukankan      html  css  js  c++  java
  • Js笔试题之正则表达式

    一.复习字符串的传统操作

    如何获取一个字符串中的数字字符,并按数组形式输出,如

    dgfhfgh254bhku289fgdhdy675gfh

    输出[254,289,675]

    分析:循环用charAt()的方法获取到每一个子字符串,判断他是不是在0~9之间,是就把他扔到准备好的数组里

    var str="dgfhfgh254bhku289fgdhdy675gfh";
    findNum(str);
    function findNum(){
        var arr=[];
        for(var i=0;i<str.length;i++){
            if(str.charAt(i)<='9'&&str.charAt(i)>='0'){
                arr.push(str.charAt(i));
                alert(arr);
            }
        }
    }
    

    但是这样会输出[2,5,4,2,8,9,6,7,5]和我们想要的结果有点偏差,于是我们需要一个新的空的字符串,每次碰到是数字走if,碰到字符走else,走else的时候把之前那些数字存放到新的空的字符串里,然后通过push添加到数组,然后清空字符串,一以便下次重新存放

    var str="dgfhfgh254bhku289fgdhdy675";
    findNum(str);
    function findNum(){
        var arr=[];
        var result="";
        for(var i=0;i<str.length;i++){
            if(str.charAt(i)<='9'&&str.charAt(i)>='0'){
                result+=str.charAt(i);        //注意添加方向不要反了
            }
            else{
                if(result){
                    arr.push(result);
                    result="";
                }
            }
        }
        alert(arr)
    }
    

    还有个隐患:如果最后以数字结尾,则最后不会进入else,最后几位数字会读不到,因此for循环外面再添加一遍else里面的if循环

    二.什么是正则,有什么用

    正则:也叫做规则,让计算机能够读懂人类的规则

    *前端哪些地方用到正则?

    比如注册页面输入用户名,我们给定一套规则,判断他输入的对不对

    *范围?

    正则都是用来操作字符串的(即不要用他去操作对象什么的)

    *怎么写?

    正则也是一个系统对象,跟数组、json一样,也有个写法规则

    简写   var re=//;                          //只写两斜杠,浏览器会认为是注释,所以尽量不要给他为空,注意两斜杠之间不要有引号

    全称   var re=new RegExp();        //Reg是正则的简写,Exp是表达式的简写

    大部分情况用简写,只有一种情况用全称写法:正则需要传参的时候

    注:全称写法用到时,需要两个\,否则是转义字符

    三.正则表达式的常用方法

    1.test

    正则去匹配字符串,如果匹配成功就返回真,匹配失败就返回假

    写法:正则.test(字符串)

    如:

    var str='abcdef';

    var re=/b/;       //bc一个整体也在字符串中,弹出true,但是写bd,弹出false,因为字符串中没有bd这么一个整体

    alert(re.test(str));

    弹出true

    扩展:

    检测一个字符串是不是全是数字

    var str='8621t56461';

    var re=//;

    if(re.test(str)){

        alert("不全是数字");

    }

    else{

        alert("全是数字");

    }

    两斜杠之间要写什么呢?引入转义字符

    s(S):空格(非空格)

    d(D):数字(非数字)

    w(W):字符(非字符)   字符包括字母、数字、下划线

    2.search

    正则去匹配字符串,如果匹配成功,就返回匹配成功的位置,如果匹配失败就返回-1
    search的写法:字符串.search(正则)
    如:
    var str="abcdef";
    var re=/b/;
    alert(str.search(re));
    返回1
    var re=/w/;
    返回-1
    var re=/B/;
    返回-1
    正则中的默认:是区分大小写的
    如果要不区分大小写,在正则的最后加标识i
    var re=/B/i
    完整写法:var re=new RegExp("B","i");

    3.match

    正则去匹配字符串,如果匹配成功,就返回匹配成功的数组,如果匹配不成功,就返回null
    match的写法:字符串.match(正则)
    比如上面例子要找出数字
    var str="dgfhfgh254bhku289fgdhdy675";
    var re=/d/;
    alert(str.match(re));
    输出2
    为什么后面的不找了?
    正则默认:正则匹配成功就会结束,不会继续匹配
    如果想要全部查找,就要加标识g(全局匹配)
    var re=/d/g;
    输出2,5,4,2,8,9,6,7,5
    跟我们想要的结果还是有偏差,如果要连着找到,而不是一个个分开,则需要
    var re=/dd/g;    //两个两个找
    var re=/ddd/g;  //三个三个找
    但是个数不一定时怎么找,引进量词
    量词:匹配不确定的位置
    +:至少出现一次
    var re=/d+/g;
    就实现上面的效果了

    4.replace

    正则去匹配字符串,匹配成功的字符去替换新的字符串
    replace的写法:字符串.replace(正则,新的字符串)
    如:
    var str="aaa";
    var re=/a/;
    str=str.replace(re,"b");
    alert(str);
    输出baa
    敏感词过滤例子
    str.replace(re,"*");
    但是如果有很多词要过滤,不能写成一整段,这样匹配不到,怎样把一个词一个词分开呢
    |:或的意思
    新的问题:所有敏感词都会替换成一颗星,怎样做到几个字几颗星呢?
    replace()的第二个参数,可以是字符串,可以是回调函数
    str.replace(re,function(){
        return '*';
    });
    现在和上面那句话作用一样
    回调函数的第一个参数,就是匹配成功的字符,即可以通过第一个参数的长度,来给他返回几颗星
    str.replace(re,function(str){
        var result='';
        for(var i=0;i<str.length;i++){
            result+='*';
        }
        return result;
    });

    四.正则表达式字符类

    字符类:一组相似的元素(用[]表示[]的整体代表一个字符,()是分组和子项的意思)
    1.任意字符
    [abc]
    如o[usb]t--obt、ost、out
    2.范围
    [a-z]、[0-9]
    如id[0-9]--id0、id5

    3.排除

    [^a]

    如o[^0-9]t--oat、o?t、o t

    例子:过滤标签

    过滤掉<>(如<div>、</div>、<h2 class="sfsdf">)

    var re=/<[wW]+>/g;          //中括号里是或的关系,也就是字符或非字符都有了,包括了斜杠,引号等

    另一种做法:    var re=/<[^>]+>/g;

    五.正则表达式转义字符

    .(点):任意字符       .:真正的点

    s(S):空格(非空格)

    d(D):数字(非数字)

    w(W):字符(非字符)   字符包括字母、数字、下划线

    数字:重复子项(1:重复的第一个子项,2:重复的第二个子项...)

    var str="abca";

    var re=/(a)(b)(c)1/ ;                         //true,为什么不用var re=/(a)(b)(c)a/ ;一样能匹配成功,数字,用于不确定的子项字符

    var re=/(a)(b)(c)2/ ;                         //false

    alert(re.teat(str));

    例子:找某个字符串中出现最多的字符和它一共出现多少次

    var str="vbbbbhybbfhbbgbbb";

    var arr=str.split("");

    str=arr.sort().join("");

    var value="";       //存放出现最多的字符

    var index=0;       //存放次数

    var re=/(w)1+/g;     没有1,re就是一整个排好序的字符串,有了1就是出现过的有重复的取出来像这样bbb...,hh

    str.replace(re,function($0,$1){     //$0代表整体,$1代表第一个子项
        if(index<$0.length){         //$0:每一组重复的元素
            index=$0.length;
            value=$1;
        }
    })
    alert('出现最多的字符是'+value+',出现次数是'+index);

    (B):独立的部分(非独立的部分)  独立的部分(起始、结束、空格)

    如:

    var str="onetwo";

    var re=/one/;    //起始位置,true

    var re=/one/;    //false,要true,one和two之间加空格或者只有one

    alert(re.test(str));

    独立部分应用举例

    之前有用到用封装好的函数来获取className

    function getByClass(oparent,sClass){

        var aEle=oparent.getElementsByTagName("*");

        var aResult=[];

        var i;

        for(i=0;i<aEle.length;i++){

            if(aEle[i].className==sClass){

                aResult.push(aEle[i]);

            }

        }

        return aResult;

    };

    这个会有bug

    <div class="box1"></div>

    <div class="box1box2"></div>

    <div class="box1 box2"></div>

    用这个方法获取box1,只能获取到第一个

    用正则来改写

    function getByClass(oparent,sClass){

        var aEle=oparent.getElementsByTagName("*");

        var aResult=[];

        var i;

        var re=new RegExp('\b'+sClass+'\b')

        for(i=0;i<aEle.length;i++){

            if(re.test(aEle[i].className)){

                aResult.push(aEle[i]);

            }

        }

        return aResult;

    };

    六.量词

    不确定的字符个数

    量词:{}

    {4,7}   最少出现4次,最多出现7次

    {4,}     最少出现4次

    {4}      正好出现4次

    +是{}的简写,相当于(1,)

    ? 相当于{0,1}    //出现0次或者1次

    * 相当于{0,}     //至少出现0次,可以没有

    七.正则收尾

    ^:正则的最开始位置,表示起始的意思

    $:正则的最后,表示结束的意思

    例子:去掉字符串里的空格

    var re=/^s+|s+$/g;

    str.replace(re,"");

    例子:检测邮箱

    var re=/^w+@[a-z0-9]+(.[a-z]+){1,3}$/;

    八.前向声明和反前向声明

    (?=) :前向声明

    (?!):反前向声明

    举例

    var str="abacad";

    var re=/a(?=b)/g;

    str=str.replace(re,"*");

    alert(str);

    输出:*bacad

    如果改为var re=/a(?!b)/g;

    输出:ab*c*d

  • 相关阅读:
    cordova build android get Execution failed for task ':dexArmv7Debug'
    brew install memcache get Error: Formulae found in multiple taps
    快速激活JetBrains系列产品
    NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
    `libsass` bindings not found. Try reinstalling `node-sass`?
    Cordova 快速入门记录
    perl: warning: Setting locale failed.
    httpclient源码分析之 PoolingHttpClientConnectionManager 获取连接
    httpclient源码分析之MainClientExec
    fastjson从1.1.41升级到1.2.28的坑
  • 原文地址:https://www.cnblogs.com/zhangwenkan/p/4182743.html
Copyright © 2011-2022 走看看