• ES6小实验-复习正则表达式


    正则表达式总是记不住,这一次参考了网上一篇文章,是该好好复习一遍了

    正则表达式构造函数(四种写法):

    var regex = new RegExp('xyz', 'i')
    var regex = new RegExp(/xyz/i)
    var regex = /xyz/i
    // ES6的写法。ES5在第一个参数是正则时,不允许此时使用第二个参数,会报错。 
    // 返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。
    // 下面代码返回”i”。
    new RegExp(/abc/ig, 'i').flags

    ECMAScript5明确规定,使用正则表达式字面量必须像直接调用RegExp构造函数一样,每次都创建新的RegExp实例,

    var re = null,
        i
    for( i=0; i < 3; i++) {
        re = /cat/g
        console.log(re.test("catastrophe"))//true true true
        console.log(re.test("catastrophe"))//false false false
    }

    上面之所以出现三个true,是因为每次都创建新的RegExp实例,下面出现三个false,是因为设置了全局标志,第二次调用是从索引为3的字符(上一次匹配的末尾)开始的,这一点要注意。

    RegExp的每个实例都有属性:

    1.global: 布尔值,表示是否设置了g标志

    2.ignoreCase:布尔值,表示是否设置了i标志

    3.lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起

    4.multiline:表示是否设置了m标志

    5.source: 正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回

    var pattern = /[bc]at/i
    console.log(pattern.global)//false
    console.log(pattern.ignoreCase)//true
    console.log(pattern.multiline)//false
    console.log(pattern.lastIndex)//0
    console.log(pattern.source)//[bc]at

    RegExp对象主要方法有

    1.exec(): 该方法专门为捕获组设计,

    var pattern = /[bc]at/i
    var str = "batterybat"
    console.log(pattern.exec(str))//["bat", index: 0, input: "batterybat"]

    返回的数组虽然是Array的实例,但包含两个额外的属性:index和input。index表示匹配项在字符串中的位置,input表示应用正则表达式的字符串,有一点要注意:对于exec()方法而言,即使模式中设置了全局标志g,它每次也只返回一个匹配项,在不设置全局标志的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项的信息。而在设置了全局标志的情况下,每次调用exec()则都会在字符串中继续查找新的匹配项。test()也是类似,这与字符串的match()方法有区别

    var pattern1 = /cat/i
    console.log(pattern1.exec("catastrophe"))//["cat", index: 0, input: "catastrophe"]
    console.log(pattern1.exec("catastrophe"))//["cat", index: 0, input: "catastrophe"]
    
    var pattern2 = /cat/ig
    console.log(pattern2.exec("catastrophe"))//["cat", index: 0, input: "catastrophe"]
    console.log(pattern2.exec("catastrophe"))//null

    从下面实验中可以看得更加清楚:

    var text = "cat,bat,sat,fat"
    var pattern2 = /.at/g
    var matches = pattern2.exec(text)
    console.log(matches.index)//0
    console.log(matches[0])//cat
    console.log(pattern2.lastIndex)//3
    
    var matches = pattern2.exec(text)
    console.log(matches.index)//4
    console.log(matches[0])//bat
    console.log(pattern2.lastIndex)//7

    在全局模式下,lastIndex的值每次调用exec()后都会增加,而在非全局模式下则始终保持不变。

    2. test(),在模式与参数匹配的情况下返回true,否则返回false,

    限定符是最容易忘记的,因为比较多,并且又不是经常用,

            [a-z0-9]:匹配括号中的字符集中的任意字符
            [^a-z0-9]:匹配任意不在括号中的字符集中的字符
            d:匹配数字
            D:匹配非字符
            w:匹配字母和数字及_
            W: 匹配非字母和数字及_
            0: 匹配null字符
            : 匹配空格字符
            . : 匹配除换行外的任意字符
            
    : 匹配换行符
            
    : 匹配回车字符
            	: 匹配制表符
            s: 匹配空白字符,空格,制表符,换行符
            S: 匹配非空白字符
            ^ : 行首匹配
            $ : 行尾匹配 
            x?: 匹配0或1个x
            x*: 匹配0或任意多个x
            x+: 匹配至少一个x
            (xyz)+:匹配至少一个(xyz)
            x{m,n}:匹配最少m个,最多n个x
            this|where|logo: 匹配this或where或logo中任意一个 

    贪婪量词*和+:js默认是贪婪匹配,也就是说匹配重复字符是尽可能多地匹配。

    惰性(最少重复匹配)量词?:当进行非贪婪匹配,只需要在待匹配的字符后面跟随一个?即可。

    var reg1 = /a+/;
    var reg2 = /a+?/;
    var str = 'aaab';
    console.log(str.match(reg1)); // ["aaa"]
    console.log(str.match(reg2)); // ["a"]

     分组,分组在正则表达式用()表示,它可以将某些有规律重复的表达式括起来重用,比如:

    对于IP地址的匹配可以写成:

    d{1,3}.d{1,3}.d{1,3}.d{1,3}

    我们会发现它有部分是重复的,所以也可以分组实现:

    d{1,3}(.d{1,3}){3}

    对于分组而言,整个表达式永远是第0组

    不捕获就是在分组的前边加上?:,可以在不需要捕获分组的表达式中使用,加快表达式执行速度。就拿匹配<title>xxx</title>标签来说,通过分组可以简写为:

    <(title)>.*</1>

    但是如果是(?:title),则1就不能捕获到这个子组了,只能捕获第一个出现的非?:的分组作为1

    同时注意(?:title)本身会在完整匹配中,只是不在子组中,注意和断言的区别

    var str = "<title>xxx</title>"
    var pattern = /<(title)>.*</1>/ig
    console.log(str.match(pattern))//["<title>xxx</title>"]
    
    var str = "<title>xxx</title>"
    var pattern = /<(?:title)>.*</1>/ig
    console.log(str.match(pattern))//null

    JS只支持先行断言和先行否定断言

    1.先行断言,(?=exp)表示先匹配字符串右边的exp,然后再匹配左边的表达式,例子:

    var str = "cooking,sing"
    var pattern = /[a-z]*(?=ing)/
    console.log(str.match(pattern))//cook

    2.先行否定断言,(?!exp)表示先匹配右边的exp,然后再匹配左边的表达式,例子:

    var str = "cooking,sing"
    var pattern = /[a-z]*(?!ing)/
    console.log(str.match(pattern))//cooking

     贪婪和回溯结合:

  • 相关阅读:
    列举ASP.NET 页面之间传递值的几种方式
    SQL Server 2010附加数据库失败:无法打开物理文件拒绝访问解决方法
    运行出现错误是:未能加载文件或程序集 CrystalDecisions.Web Version=10.2.3600,找不到它的依赖项,并且问题出现在web.config里面
    快捷键
    VS中出现无法嵌入互操作类型
    Java模拟试题(2015-9-2)
    IDEA 的配置文件导入命名空间
    第四章、程序计数器
    IDEA建Mappper.xml
    第三章、运行时数据区概述及线程
  • 原文地址:https://www.cnblogs.com/fengz/p/6662276.html
Copyright © 2020-2023  润新知