zoukankan      html  css  js  c++  java
  • JS正则①—RegExp概述

    1.RegExp

    ECMAScript通过RegExp类型支持正则表达式。

    格式:

    let expression = /pattern/flags

     pattern(模式):

    • 可以是任何简单或复杂的正则表达式,包括字符类、限定符、分组、向前查找、反向引用

    flags(标记):

    • 每个正则表达式可以带零个或多个flags,用于控制正则表达式的行为:
      • g:全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束
      • i:不区分大小写,表示查找匹配时忽略pattern和字符串的大小写
      • m:多行模式,表示查找到第一行文本末尾时会继续查找
      • y:黏附模式,表示只查找从lastIndex开始及之后的字符串
      • u:Unicode模式,启用Unicode匹配
      • s:dotAll模式,表示元字符,匹配任何字符(包括 或 )

    说明:所有的元字符在模式中必须转义(),包括:

      (   [   {      ^   $   |   )   ]   }   ?   *   +   .

    元字符在正则表达式中都有一种或多种特殊功能,所以要匹配上面这些字符本身,就必须使用反斜杠来转义。示例:

    // 匹配第一个 "bat" 或 "cat",忽略大小写
    let pat1 = /[bc]at/i
    
    // 匹配第一个 "[bc]at",忽略大小写。这里的[]两个符号也要在匹配的内容中
    let pat2 = /[bc]at/i
    
    // 匹配所有以 "at" 结尾的三字符组合,忽略大小写
    let pat3 = /.at/gi
    
    // 匹配所有 ".at",忽略大小写
    let pat4 = /.at/gi

     上面代码中的正则表达式都是用字面量形式定义的。正则表达式也可以使用RegExp构造函数来创建,它接收两个参数:模式字符串和标记字符串(可选的)。示例:

    let pat1 = new RegExp("[bc]at","i")
    // 等同于
    let pat1 = /[bc]at/i

     由于构造函数两个参数都是字符串,所有的元字符都必须二次转义。示例:

     2.RegExp实例属性

    每个RegExp实例都有谢列属性,提供有关模式的各方面信息

    • global:布尔值,表示是否设置了 g 标记。
    • ignoreCase:布尔值,表示是否设置了 i 标记。
    • unicode:布尔值,表示是否设置了 u 标记。
    • sticky:布尔值,表示是否设置了 y 标记。
    • lastIndex:整数,表示在源字符串中下一次搜索的开始位置,始终从 0 开始。
    • multiline:布尔值,表示是否设置了 m 标记。
    • dotAll:布尔值,表示是否设置了 s 标记。
    • source:正则表达式的字面量字符串(不是传给构造函数的模式字符串),没有开头和结尾的斜杠。
    • flags:正则表达式的标记字符串。始终以字面量而非传入构造函数的字符串模式形式返回(没有前后斜杠)。

    3.RegExp实例方法

    (1)exec()

    RegExp实例的主要方法是exec(),主要用于配合捕获组使用。这个方法只接收一个参数,即要应用模式的字符串。如果找到的匹配向,则返回包含第一个匹配信息的数组;如果没找到,则返回null。返回的数组虽然是Array的实例,但是包含两个额外的属性:index和input:

    • index:是字符串中匹配模式的起始位置
    • input:是要查找的字符串

    示例:

    let str = "mom and dad and baby"
    let pat = /and/gi
    
    let matche1 = pat.exec(str)
    console.log(pat.lastIndex);  
    
    let matche2 = pat.exec(str)
    console.log(pat.lastIndex);
    
    console.log(matche1);
    console.log(matche2);

    输出结果:

    注意:上面加了全局标记g,每次调用exec都会向前搜索下一个匹配项。如果不设置全局标记的话,则无论对同一个字符串调用多少次exec()只返回第一个匹配项。

      设置了全局标记,每次调用exec()都会返回字符串中的下一个匹配项,直到搜索到字符串末尾。注意模式pat的lastIndex属性都会变化。以此来反映上一次匹配的最后一个字符的索引

    (2)test()

    正则表达式的另一个方法是test(),接收一个字符串参数。如果输入的文本与模式匹配,则参数返回true,否则返回false。

     示例:

    let str = '123-45-6789'
    let pat = /d{3}-d{2}-d{4}/
    
    pat.test(str)  // true

     4.字符串的正则方法

    ES6之前,字符串对象共有4个方法,可以使用正则表达式:match()replace()search()split()

    ES6 将这 4 个方法,在语言内部全部调用RegExp的实例方法,从而做到所有与正则相关的方法,全都定义在RegExp对象上。

    • String.prototype.match 调用 RegExp.prototype[Symbol.match]
    • String.prototype.replace 调用 RegExp.prototype[Symbol.replace]
    • String.prototype.search 调用 RegExp.prototype[Symbol.search]
    • String.prototype.split 调用 RegExp.prototype[Symbol.split]
  • 相关阅读:
    第01组 每周小结(3/3)
    第01组 每周小结(2/3)
    第01组 每周小结 (1/3)
    第01组 Beta冲刺总结
    第01组 Beta冲刺 (5/5)
    第01组 beta冲刺(4/5)
    第01组 beta冲刺(3/5)
    第01组 beta冲刺(2/5)
    第01组 Beta冲刺(1/5)
    latex Illegal, another ibstyle command
  • 原文地址:https://www.cnblogs.com/codexlx/p/14417266.html
Copyright © 2011-2022 走看看