zoukankan      html  css  js  c++  java
  • 正则基础知识

    创建正则表达式

    1.使用new来创建

     var exp = new RegExp('box' , 'gi' );
    

      

    g	全局匹配
    i	忽略大小写
    m	多行匹配
    

      

    2.使用字面量

    var exp =/box/gi;

      

    直接用2个 / ;

    在俩个斜杠后加上模式修饰符;

    俩种创建方式比较:

    1.使用字面量方式创建用的更加广泛;

    2.当要匹配的内容是变量时,只能使用new来创建.

    正则表达式的测试

    1.test( )

    正则表达式对象.test(字符串)

    参数:要匹配的字符串

    返回值:匹配成功返回true,失败返回false

    例1:
    var exp = /Box/i;
    var str = 'box' ;
    alert(exp.test(str));
    =>   true     忽略大小写 ;
    

      

    例2:
    var exp = /abc/g;
    var str = 'abcab';
    var res = exp.test(str);
    console.log(res);
    console.log(exp.test(str));
    console.log(exp.test(str));
    =>   true       //从第一个开始匹配,匹配到了abc 返回true;   
    =>   false      //由于开启了全局匹配,所以从上次匹配之后的位置开始匹配(也就是从第二个a开始);   若没有g 则每次都会从头开始匹配
    =>   true       //由于上次匹配是false并且已经将字符串str查找完了,所以又从头开始匹配
    
    

      

    注:

    ​ 开启了全局匹配g后,正则表达式内部有一个lastIndex的属性,用以记录下次开始查找的下标,保证其每次从lastIndex的位置开始查找

    例3:
    var exp = /abc/g;                   //同一正则表达式匹配不同字符串
    var str1 = 'abc';
    var str2 = 'abcab';
    console.log(exp.test(str1));
    console.log(exp.test(str2));
    =>   true;              //从str1的0位开始匹配,匹配到了abc,返回true,  此时lastIndex为3
    =>   false;             //从str2中lastIndex的位置开始匹配,也就是从第二个a开始
    

      

    例4:
    var exp1 = /abc/g;                  //不同正则表达式匹配同一字符串
    var exp2 = /abc/g;
    var str = 'abc';
    console.log(exp1.test(str));
    console.log(exp2.test(str));
    =>   true;              //从str1的0位开始匹配,匹配到了abc,返回true
    =>   true;              //从str1的0位开始匹配,返回true
    

      

    2.exec( )

    exec(字符串):该方法为专门为捕获组而设计的

    参数:要匹配的字符串

    返回值:返回的是一个数组。如果不匹配则返回null

    关于返回值数组的说明:

    它确实是Array的实例。

    但是这个数组有两个额外的属性:index和 input

    index:表示匹配的字符串在源字符串中的索引

    input:表示匹配的源字符串。

    数组的第一项是与整个模式匹配的字符串,其他项是与模式中捕获组匹配的字符串

    如果没有捕获组,则数组中只有第一项。关于捕获组的概念以后再说

    例1:
            var exp = /abc/gi;
            var str = "aaabcccdabcAbcAdaBc";
            var strNew = "";
            while (strNew=exp.exec(str)){           //使用while循环,将所有匹配到字符串输出来
                console.log(strNew[0])              //由于返回的是一个带有很多属性的数组,所以我们只要数组中的字符串,也就是索引为0.
            }
    

      

    正则表达式的规则

    字符类:单个字母数字下划线
    .                                   //匹配除换行符外的任意字符(当点放在[]中是,没有特殊意义)
    var exp = /d/g;                    // [0-9]
    var exp = /D/g;                    //[^0-9]
    var exp = /w/g;                    //[a-zA-Z0-9_];
    var exp = /W/g;                    //[^a-zA-Z0-9_];
    

      

    字符类:空白字符
                                 匹配null 字符
                                 匹配退格字符
    
                                 匹配换行符
    
                                 匹配回车字符
    	                             匹配制表符
    s                             匹配空白字符、空格、制表符和换行符
    S                             匹配非空白字符
    

      

    单词边界
    
    示例
    /cat/  匹配到cat这个单词
    

      

    /B 非单词边界
    

      

    元字符/元符号                    匹配情况
    ^                             行首匹配
    $                             行尾匹配
    

      

    字符类:重复字符
    元字符/元符号                                匹配情况
    ?  例如(x?)                            匹配0个或1 个x
    *  例如(x*)                            匹配0个或任意多个x
    +  例如(x+)                            匹配至少一个x
    (xyz)+                                     匹配至少一个(xyz)
    {m,n} 例如x{m,n}  n>=次数>=m            匹配最少m个、最多n个x
    {n}                                        匹配前一项n次     
    {n,}                                    匹配前一项n次,或者多次
    

      

    1.[ ]

    匹配[ ]内的任意一个字符

    var exp = /[abc]/gi;                // []内代表匹配其中的一个字符: a 或 b 或 c
    var exp = /[a-zA-Z0-9_$]/g;         //匹配26个大小写字母,0-9数字,下划线_  美元符$ 中的任意一个;
    var exp = /[^a-zA-Z]/g              //匹配任意不在括号中的字符集中的字符;
    [ ]也可以配合? * + {} 来使用; 如[a-z]+ 匹配至少一个[a-z]范围内的任意一个;
    

      

    2. ^

    俩种用法:

    1.放在[ ] 内 表示非

    var exp = /[^a-zA-Z]/g              //匹配任意不在括号中的字符集中的字符;
    

    2.放在[ ] 外,表示行首匹配

    var exp = /^d/g;                   //规定行首必须是数字     
    var str = '123qq';                  
    console.log(exp.test(str));         //行首为数字1,返回true;  
    console.log(exp.lastIndex);         //此时lastIndex 为1
    console.log(exp.test(str));         //从下标为1的位置开始匹配,虽然下标为1的位置是数字,但却不是行首,返回false;
    

      

    3. $

    表示行尾匹配,用法与^ 相近

    ^ 和 $ 合用

    var exp = /^dd$/g;                //规定行首和行尾必须是数字
    var str = '12';
    var str2 = '123';
            console.log(exp.test(str));     // true
            console.log(exp.lastIndex);     // 2
            console.log(exp.test(str));     //false
            console.log(exp.lastIndex);     //0
            console.log(exp.test(str));     //true
            console.log(exp.test(str2));    //false     //exp中规定了行首行尾为数字,中间无内容
    

      

    4. .

    匹配除换行符外的任意字符(当点放在[ ]中是,没有特殊意义)

    var exp = /./g;
    var str = 'a';
    console.log(exp.test(str));
    =>    true
    

      若想匹配它本身.

    var exp = /./g;
    

      

    5. |

    择一匹配(管道符号) 表示或

    var exp = /a|b/g;
    var str = 'a';
    console.log(exp.test(str));
    =>    true
    

      数量词的匹配:默认都是贪婪匹配

    6. ?

    匹配0个或者1个

    7. *

    匹配0个或者多个

    var exp = /a*/g;
    var str = 'aaaaa';
        console.log(exp.test(str));         //true
        console.log(exp.test(str));         //true
    

      

    8. +

    匹配1个或多个

    var exp = /a+/g;
    var str = 'aaaaa';
        console.log(exp.test(str));         //true
        console.log(exp.test(str));         //false
    

      

    9. {n}

    匹配n个,只能是n个

    10. {n,}

    匹配至少n个

    11. {n,m}

    匹配至少n个,最多m个

    基本的正则表达式验证

    写一个正在表达式,判断手机号是否合法
    var exp = /1[34578]d{9}$/g;
    var str = '13979318939';
        console.log(exp.test(str));
    => true
    写一个正在表达式,判断邮箱是否合法
    var exp = /^w{3,15}@[w-]+.(com|cn|net|org|edu|com.cn)$/gi;
    var str = '133_d@cn.com.cn';
        console.log(exp.exec(str)[0]);
    =>  133_d@cn.com.cn   
    写一个正则表达式,判断图片的地址是否合法
    var exp = /^(http|https)://.+.(jpg|jpeg|gif|png)$/gi;
    var str = 'http://3323498dsfledf.png';
        console.log(exp.exec(str)[0]);
    =>  http://3323498dsfledf.png
    写一个正则表达式,爬取一堆字符串中的所有图片地址
    var exp = /http://[^:]+.(jpg|jpeg|gif|png)/gi;
    写一个正则表达式,将字符串中的重复去掉
    var exp = /(.)1+/gi;
    var str = "aabbccdd";   
        console.log(str.replace(exp,'$1'));
    =>  abc
    

      

    分组
    其中分组体现在:所有以(和)元字符所包含的正则表达式被分为一组,每一个分组都是一个子表达式,它也是构成高级正则表达式的基础。如果只是使用简单的(regex)匹配语法本质上和不分组是一样的,如果要发挥它强大的作用,往往要结合回溯引用的方式。
    
    var str = '123-mm';
    var strReg = str.replace(/(d+)-([A-Za-z]+)/g,'$2');
    console.log(strReg)//mm  上面那段$2这个就是表示正则第二组个匹配到的内容
    

      

    方法

    1.search( )
    str.search(exp);
    
    检索与正则表达式相匹配的第一个匹配项的索引。
    
    返回值: 索引 ,没有返回-1;
    

      注:search( )不支持全局,每次调用总是从0开始查找.加不加g都一样

    2.match( )
    str.match(exp);
    
    把满足正则表达式的所有字符串一起返回
    
    返回值: 数组 ,没有返回null;
    
    var str = "abc134ABC244co9";
        console.log(str.match(/d+/gi));            //获取str中的所有数字的数组
    =>  ["134","244","9"]
    

      注:如果想获取所有的满足的,应该使用全局g,使用全局的时候,分组的信息则拿不到

    3.replace( )
    str.replace(exp,newStr);
    
    将正则表达式替换
    
    返回值: 替换之后的字符串
    
    var str = "123aaa244";
        console.log(str.replace(/d/gi,""));        //将str中的数字全部去掉
    =>  aaa     
    
    
    写一个正则表达式,将字符串中的重复去掉
    var exp = /(.)1+/gi;
    var str = "aabbccdd";   
        console.log(str.replace(exp,'$1'));
    =>  abc  
    

      

    4.split( )
    str.split(exp,length);
    
    length:可选参,切出来的数组的最大长度
    
    使用split 拆分成字符串数组
    
    返回替换之后的字符串
    
    
    
    var str = "102dsfe00dfefsf55";
    var exp = /D+/gi;                              //用所有非数字来切割
        console.log(str.split(exp));    
    =>  ["102","00","55"]
    

     https://www.cnblogs.com/moqing/archive/2016/07/13/5665126.html

    /**
     * @description:万能判断
     * @param {type}
     * value/判断的焦点
     * type:   1/false(默认undefind也是false) 2/与焦点比对类型(小写)
     * @return:1/焦点类型(小写)                2/boolean
     */
    function checkType(value, type) {
      const prototypeString = Object.prototype.toString.call(value)
      const typeString = prototypeString.replace(/S*s|]/gi, '').toLowerCase()
      return type ? type == typeString : typeString
    }
    export default checkType
    

      

    匹配出现a或者b组合一起至少3次以上/(a|b){3,}/,匹配aaa,bbb,aab,baa,bba,bab等等
    

      

     

    正则表达式------捕获性分组,非捕获性分组,前瞻,后瞻
    
    
    捕获性分组
    javascript中捕获性分组是以小括号()来实现,捕获性分组工作模式()会把每个分组里匹配的值保存起来。
    
    比如利用捕获性分组把 hello world 互换成 world hello:
    
    方法一:通过exec函数
    
    var str = 'hello world';            //首先创建好字符串
    var pattern = /([a-z]+)s([a-z]+)/; //先通过正则匹配这个字符串,用分组模式来获取这两个单词
    var arr = pattern.exec(str); // exec方法返回的是一个数组,包含匹配到的字符串以及分组(也称子串)里的值
    
    console.log(arr); //['hello world','hello','world']  
    console.log(arr[0]); //'hello world' 匹配到的字符串
    console.log(arr[1]); //'hello' 第一个分组([a-z]+)的值
    console.log(arr[2]); //'world' 第二个分组([a-z]+)的值
    
    //这时候两个分组的值都得到了,接下来用字符串拼接法实现互换
    var n_str = arr[2]+' '+arr[1];
    console.log(n_str) //world hello
    
    
    方法二:通过属性$1-9
    
    
    var str = 'hello world';            
    var pattern = /([a-z]+)s([a-z]+)/; 
    pattern.test(str); //这个地方必须运行正则匹配一次,方式不限,可以是test()、exec()、以及String的正则方式
    
    console.log(RegExp.$1) //'hello' 第一个分组([a-z]+)的值
    console.log(RegExp.$2) //'world' 第二个分组([a-z]+)的值
    
    var n_str = RegExp.$2+' '+RegExp.$1;
    console.log(n_str) //world hello
    
    
    方法三:通过String的replace()
    
    var str = 'hello world'; 
    var pattern = /([a-z]+)s([a-z]+)/; 
    var n_str = str.replace(pattern,"$2 $1"); //这里的$1、$2与方法二里的RegExp.$1、RegExp.$2作用是相同的。
    console.log(n_str) //world hello
    
    非捕获性分组:(?:)
    非捕获性分组工作模式下分组(?:)会作为匹配校验,并出现在匹配结果字符里面,但不作为子匹配返回。
    
    比如利用非捕获性分组获取字符串000aaa111,而且只返回一个值为aaa111的数组:
    
    
    //先看用捕获性分组匹配会返回什么
    var str1 = '000aaa111';             
    var pattern = /([a-z]+)(d+)/; //捕获性分组匹配
    var arr = pattern.exec(str1);  
    console.log(arr) //['aaa111','aaa','111']   结果子串也获取到了,这并不是我们想要的结果
    
    
    //非捕获性分组
    var str2 = '000aaa111';
    var pattern2 = /(?:[a-z]+)(?:d+)/; //非捕获性分组匹配
    var arr2 = pattern.exec(str2);  
    console.log(arr2) //['aaa111']  结果正确  
    
    前瞻:(?=)和(?!)
    前瞻分为正向前瞻和反(负)向前瞻,正向前瞻(?=表达式)表示后面要有什么,反向前瞻(?!表达式)表示后面不能有什么。
    
    前瞻分组会作为匹配校验,但不出现在匹配结果字符里面,而且不作为子匹配返回。
    
    正向前瞻匹配一批图片格式:
    //正向前瞻,匹配.jpg后缀文件名
    var str = '123.jpg,456.gif,abc.jpg';
    var partern = /w+(?=.jpg)/g; //正向前瞻匹配
    console.log(str.match(partern)); //['123', 'abc']   返回结果正确,没有匹配456.gif
    
    
    反向前瞻匹配一批字母加数字:
    //反向前瞻,匹配3个及以上的a,而且后面不能有000的字符
    var str = 'aaa000 aaaa111 aaaaaaa222';
    var partern = /a{3,}(?!000)/g; //反向前瞻匹配
    console.log(str.match(partern)); //['aaaa', 'aaaaaaa']   返回结果正确,没有匹配aaa000
    
    
    前瞻,可以放在位置不固定,可前匹配和后匹配,如:/(?=.jpg)w+/g;
    
    后顾:(?<=)和(?<!) —JavaScript不支持
    后顾分为正向后顾和反(负)向后顾,正向后顾(?<=表达式)表示前面要有什么,反向后顾(?<!表达式)表示前面不能有什么。
    /正向后顾
    (?<=abc) //前面需要有abc
    
    //反向后顾
    (?<!abc) //前面不能有abc
    
    
    名词解释:
    
    前瞻 = 先行断言
    (?=) 正向前瞻 = 正向零宽先行断言
    (?!) 反向前瞻 = 负向前瞻 = 负向零宽先行断言
    
    后顾 = 后发断言
    (?<=) 正向后顾 = 正向零宽后发断言
    (?<!) 反向后顾 = 负向后顾 = 负向零宽后发断言
    
    备注,总结
    可以通过多个前瞻组合一块控制,字符串里边必须包含指定字符。
    示例:
    (?=.[0-9].)(?=.[A-Z].)(?=.[a-z].).{6,20} 可以匹配包含大写字母,小写字母,数字
    

      

  • 相关阅读:
    【数据操作】存储过程编写经验和优化措施
    【项目管理】产品经理的核心能力模型(译)
    [转] SAP DEVELOPMENT TECHNOLOGY LIST
    【架构设计】五个基本工作流模式(转)
    【工具推荐】Office Open XML
    【经验分享】企业可选的当前主流OA产品
    【项目管理】项目启动阶段 制定项目章程
    【转贴文章】 Dos命令收集
    【架构设计】Web应用程序安全性简介
    [转]what is SAP NetWeaver
  • 原文地址:https://www.cnblogs.com/smzd/p/8798805.html
Copyright © 2011-2022 走看看