zoukankan      html  css  js  c++  java
  • 引用类型-RegExp类型

    JavaScript高级程序设计(第三版)笔记-第五章-RegExp类型


    定义正则表达式有两种方式

    1、用字面量形式定义正则表达式:

    ver expression = /patterns/flags;

    patterns:可以是任何简单或者复杂的正则表达式
    flags:
        g:表示全局
        i:表示不区分大小写
        m:表示多行模式,在到达一行的末尾时还会继续查找下一行

    var patterns1 = /at/g;//匹配字符中所有“at”的实例
    var patterns2 = /[bc]at/i;//匹配所有的"bat"或"cat",不区分大小写
    var patterns3 = /.at/gi;//匹配所有的以"at"结尾的三个字符的组合,不区分大小写
            

    模式中使用的所有元字符都必须转义,正则表达式中的元字符包括:( [ { ^ $ | ) ? * + . ] }

    var patterns4 = /[bc]at/i;//匹配第一个"[bc]at",不区分大小写

    2、用RegExp构造函数定义正则表达式,他接受两个参数(patterns,flags)

    var patterns2 = new RegExp("[bc]at","i");//与var patterns2 = /[bc]at/i;相同

    同样使用RegExp同样也要对元字符进行转义而且是双重转义

    vqr pattterns4 = new RegExp("\[bc\]at","i");与var patterns4 = /[bc]at/i;相同

    这两种方法创建的正则表达式不一样。正则表达式字面量会始终共享一个RegExp实例,而使用构造函数创建的每一个新RegExp实例都是一个新实例

    var re = null,
                i;
            for(i=0;i<10;i++){//只为/cat/创建了一个RegExp实例,第一次调用成功,第二是失败,因为当第二次调用时是从索引值为3的字符开始的,所以找不到他,当第三次调用时又会从开头开始。
                re = /cat/g;
                re.test("catgghi");
            }
            for(i=0;i<10;i++){//用RegExp构造函数在每次循环中都会创建正则表达式,所以每次调用test()都会返回true
                re = new RegExp("cat","g");
                re.test("catgghi");
            }

    RegExp实例属性


    global:是否设置了g标志
    ignoreCase:是否设置了i标志
    multiline:是否设置了m标志
    lastIndex:表示开始搜索下一个匹配项的字符位置,从0算起
    source:正则表达式的字符串表示

    var patterns2 = /[bc]at/i;
    alert(patterns2.global);  //false
    alert(patterns2.source); //"[bc]at"

    RegExp实例方法


    RegExp对象的主要方法是exec(),专门为捕获组设计的,接受一个参数,返回包含匹配项信息的数组,相对于Array的实例,多了两个属性index和input,在数组中,第一项是匹配的字符串,其他项是与模式中的捕获组匹配的字符串。

    input:表示应用正则表达式的字符串
    index:表示匹配项在字符串中的位置

    var text = "mom and dad and baby";
    var pattern = /mom (and dad (and baby)?)?/gi;
    var matches = pattern.exec(text);
    alert(matches.index); //0;
    alert(matches.input); //"mom and dad and baby"
    alert(matches[0]); //"mom and dad and baby"
    alert(matches[1]); //"and dad and baby"
    alert(matches[2]); //"and baby"

    对于exec()方法,设置了全局标志(g),每次也只会返回一个匹配项。不设置全局标志的情况下,在同一个字符串上调用它是将始终返回第一个匹配项信息,设置了(g),每次调用它时都会在字符串中继续查找。

    var text = "cat, bat, sat, fat";
    
    var pattern1 = /.at/;
    
    var matches = pattern1.exex(text);
    alert(matches.index); //0
    alert(matches[0]); //cat
    alert(pattern1.lastIndex); //0
    
     matches = pattern1.exex(text);
    alert(matches.index); //0
    alert(matches[0]); //cat
    alert(pattern1.lastIndex); //0
    
    var pattern2 = /.at/g;
    
    var matches = pattern2.exex(text);
    alert(matches.index); //0
    alert(matches[0]); //cat
    alert(pattern1.lastIndex); //3
    
    matches = pattern1.exex(text);
    alert(matches.index); //5
    alert(matches[0]); //bat
    alert(pattern1.lastIndex); //8

    正则表达式的第二种方法是test(),接受一个参数。在模式与该参数匹配的时返回ture,否则返回false。

    RegExp构造函数属性

    长属性名       短属性名               说明
    input          $_       最近一次匹配的字符串
    lastMatch       $&       最近一次的匹配项
    lastParen        $+       最近一次匹配的捕获组
    leftContext     $`       input字符串中lastMatch之前的文本
    multiline     $*      布尔值,表示是否所有表达式都使用多行模式。
    rightContext     $'        input字符串中lastMatch之后的文本

    var text = "this has been a short summer";
    var pattern = /(.)hort/g;
    if(pattern.test(text)){
                alert(RegExp.input);//(RegExp.$_)      //this has been a short summer
                alert(RegExp.leftContext);//(RegExp["$`"])   //this has been a
            }

    注意:由于某些短属性名大都不是有效的ECMAScript标识符,所以要通过方括号语法来访问他们。

    还有9个用于存储捕获组的构造函数属性,RegExp.$1存储第一个捕获组,以此类推。

    不要在该奋斗的年纪而选择了安逸
  • 相关阅读:
    (转)Java任务调度框架Quartz入门教程指南(二) 使用job、trigger、schedule调用定时任务
    (转)Quartz任务调度(1)概念例析快速入门
    如何解决Win10预览版一闪而过的disksnapshot.exe进程?
    【转】SSH中 整合spring和proxool 连接池
    datatables 配套bootstrap3样式使用小结(1)
    PowerDesigner16逆向工程生成PDM列注释(My Sql5.0模版)
    PowerDesigner连接mysql逆向生成pdm
    Power Designer逆向操作(从mysql5.0生成数据库的物理模型)
    范仁义js课程---53、匿名函数应用
    范仁义js课程---52、匿名函数
  • 原文地址:https://www.cnblogs.com/qqandfqr/p/5524688.html
Copyright © 2011-2022 走看看