• 正则表达式


    正则表达式

    1. 适用场景:

      1. 正则表达式对象RegExp:exec()/test()

      2. 字符串String:match()/search()/split()/replace()

    2. 创建正则表达式

      1. 正则表达式字面量: /abc/gim
      2. 正则表达式对象 : new RegExp('abc', 'gim')

      使用字面量和正则构造函数创建的区别: 字面量是编译时处理,使用构造函数则是在运行时处理。因此字面量有更好的性能,构造函数适用于正则模式可能会改变或者是由用户输入的情况。

    3. 特殊字符

      1. 转义字符:在非特殊字符之前表示下一个字符是特殊的,在特殊字符之前表示将下一个字符的特殊性移除
      2. ^ 匹配输入的开始。在字符集[]中的起始位置则表示 非
      3. $ 匹配输入的结束
      4. * 匹配前一个表达式0次或多次,等价于{0,}
      5. + 匹配前一个表达式1次或多次,等价于{1,}
      6. ? 匹配前一个表达式0次或1次,等价于{0,1}
      7. . 匹配除换行符之外的所有单个字符
      8. (x) 匹配'x'并记住,括号也称作捕获括号,在正则表达式的匹配环节用1 2 来访问,在正则的替换环节(通常是字符串的replace()函数中)用$1 $2 $n来访问
      9. (?:x) 匹配但不记住'x',也叫做非捕获括号
      10. x(?=y) 匹配x仅当x后面紧跟着y
      11. x(?!y) 匹配x仅当x后面没有紧跟着y
      12. x|y 匹配x或y
      13. {n} 匹配前一个字符正好出现n次
      14. {n,m} 匹配前一个字符出现次数>= n <=m
      15. [xyz] 字符集合,匹配方括号中的任意字符
      16. [^xyz] 反向字符集,匹配没有包含在方括号中的任意字符
      17.  匹配一个词的边界
      18. B 匹配一个非单词边界
      19. d 匹配一个数字
      20. D 匹配一个非数字字符
      21. s 匹配一个空白字符,包括空格、换行符、制表符、换页符
      22. S 匹配一个非空白字符
      23. w 匹配一个单字字符(数字字母下划线),等价于[a-zA-Z0-9_]
      24. W 匹配一个非单字字符(数字字母下划线),等价于[^a-zA-Z0-9_]
    4. 四个可选参数:可以任意顺序组合

      1. g 全局匹配
      2. i 不区分大小写
      3. m 多行搜索
      4. y 执行“粘性”搜索,匹配从目标字符串的当前位置开始,可以使用y标志。
    5. 函数详解

      1. Regexp的exec()

        1. 首先要注意如果使用一个未分配给一个变量的正则表达式,那么随后将不能访问这个正则表达式执行结果后的属性。例如:
        /a/g.exec('abca')
        // ["a", index: 0, input: "abca"]
        /a/g.lastIndex
        // 0
        
        // 如果要访问正则的执行后的属性,应该把它先赋值给一个变量
        var r = /a/g;
        // undefined
        r.exec('abca')
        // ["a", index: 0, input: "abca"]
        r.lastIndex
        // 1
        r.exec('abca')
        // ["a", index: 3, input: "abca"]
        r.lastIndex
        // 4
        
        1. exec 执行后如果匹配失败会返回null,如果匹配成功,exec() 方法返回一个数组,并更新正则表达式对象的属性。返回的数组将完全匹配成功的文本作为第一项,将正则括号里匹配成功的作为数组填充到后面。数组中的返回字段如下图。array中有三个元素,第一个array[0]是匹配到的子串,array[1]到array[n]是括号中捕获到的分组,array['index']是匹配到的索引,array['input']是初始字符串。执行后正则表达式变量的两个属性是lastIndex和source,表示下一次匹配的开始索引,正则表达式的模式文本。

        正则 exec函数

        1. 注意exec执行正则时有无g全局匹配的标识的不同。没有g每次只匹配第一个就返回了,lastIndex置为0,下次继续从头开始匹配。有g每次会记录lastIndex的位置,当执行到最后一个匹配后会返回null标识最后一个匹配到结尾没有匹配到,然后lastIndex置0再次从头开始匹配。
        var r = /a/
        // undefined
        r.exec('abca')
        // ["a", index: 0, input: "abca"]
        r.lastIndex
        // 0
        r.exec('abca')
        // ["a", index: 0, input: "abca"]
        r.lastIndex
        // 0
        var r2 = /a/g
        // undefined
        r2.exec('abca')
        // ["a", index: 0, input: "abca"]
        r2
        // /a/g
        r2.lastIndex
        // 1
        r2.exec('abca')
        // ["a", index: 3, input: "abca"]
        r2.lastIndex
        // 4
        r2.exec('abca')
        // null
        r2.lastIndex
        // 0
        r2.exec('abca')
        // ["a", index: 0, input: "abca"]
        r2.lastIndex
        // 1
        
        1. 利用exec()如何找到全部的匹配呢?只能循环:
        var r = /a/g;
        var str = 'aba';
        var array = [];
        while ((array = r.exec(str)) !== null) {
            console.log('result is: %s, next index at: %d', array[0], r.lastIndex);
        }
        
      2. Regexp的test()

        匹配成功返回true,失败返回false,要注意有全局标识g的时候与exec类似,其lastIndex不断变化的问题

        var r = /a/g;
        // undefined
        r.test('aba')
        true
        r.lastIndex
        // 1
        r.test('aba')
        true
        r.lastIndex
        // 3
        r.test('aba')
        false
        r.lastIndex
        // 0
        r.test('aba')
        // true
        r.lastIndex
        // 1
        
      3. String的match()

        成功匹配则返回值array是一个包含了整个匹配结果以及任何括号捕获的匹配结果的 Array ;如果没有匹配项,则返回 null。
        注意match匹配时正则表达式是否有 全局搜索标志g 的情况是完全不同的。

        1. 没有g,match()和RegExp的exec()方法完全相同。array[0]为完全匹配的元素,array[1]至array[n]是捕获的子匹配。此外还有array[index] 和 array[input]
        2. 有g,则该方法返回一个 Array ,它包含所有匹配的子字符串而不是匹配对象。捕获组不会被返回(即不返回index属性和input属性)。如果没有匹配到,则返回 null

        例如:

        'aacbc'.match(/(a*)c/g)
        
        // (2) ["aac", "c"]
        'aacbc'.match(/(a*)c/)
        
        // (2) ["aac", "aa", index: 0, input: "aacbc"]
        
      4. String的search()

        与RegExp的test()类似,不过找到了返回下标,没找到返回-1

      5. String的split()

        split参数接受字符串或者正则表达式,返回数组

      6. String的replace()

        替换的时候可以用$1/$2/$n 获取到捕获的子串,如:

        var r = /(w*)s(w*)/;
        var s = 'abc def';
        s.replace(r, '$2, $1');
        // "def , abc"
        

    参考文档:

    1. mdn 正则表达式
    2. mdn exec()方法
    3. mdn match()方法
  • 相关阅读:
    【CF1015D】Walking Between Houses(构造,贪心)
    【CF1068D】Array Without Local Maximums(计数DP)
    【CF1068C】Colored Rooks(构造)
    172.处理机控制与杂项指令
    171.控制转移指令
    170.串处理指令
    169.逻辑指令
    168.算术指令
    Volume 1. Big Number(uva)
    Volume 1. String(uva)
  • 原文地址:https://www.cnblogs.com/snail222/p/7202579.html
Copyright © 2020-2023  润新知