# 正则表达式

# 一 定义

# 1 概念

描述字符模式的对象

# 2 创建方式

  • 字面量形式
var expression = /pattern/flags
// pattern 需要匹配的字符串模式
// flags 修饰符
  • 构造函数的形式
var expression = new RegExp('[bc]at','i')
// 两个参数格式都是字符串。

注意

  • 第一个参数是模式字符串,因为字符串和正则表达式都是使用 \ 进行转转义,所以在第一个参数中,如果出现 \,则需要双重转义。第二个是修饰符。
  • 字面量形式的正则已经创建便无法再去改变。可通过构造函数的形式来动态的生成一个正则实例。

正则表达式中的特殊符号

//元字符 
^ $ / \ ? | . * + () [] {} ! :

// 匹配 spiderMan
let reg1 = /.piderMan/ 
// 匹配 .spiderMan
let reg2 = /\.spiderMan/

# 3 模式规则

正则表达式的模式规则是由一个字符序列组成的。包括所有的字母和数字在内,绝大多数字符都是按照直接量仅描述待匹配的字符的。但对于一些具有特殊语义的字符,并不会按照字面意义去匹配。例如^ $,分别用来对应字符串的开始和结束。

  • 字符

    • . 任意字符。除换行符和其他unicode行终止符
    • \w 任何 ASCLL 字符组成的单词。[a-zA-Z0-9]
    • \W 任何不是 ASCLL 字符组成的单词。 [^a-zA-Z0-9]
    • \s 任何空白符
    • \S 任何非空白字符
    • \d 任何 ASCLL 数字,等价于 [0-9]
    • \D 等价于 [^0-9]
    • [...] 括号内的任意字符
    • [^...] 不在括号内的任意字符
  • 重复性

    正则表达式中某元素的重复次数

    • {n,m} 匹配前一项至少 n 次,最多 m 次。
    • {n,} 匹配前一项至少 n 次
    • {n} 匹配前一项 n 次
    • ? 匹配前一项 0-1 次。即 {0-1}
    • + 匹配前一项 1 次至多次。即 {1,}
    • * 匹配前一项 0 至多次。即 {0,}

    贪婪性的重复。匹配重复的字符尽可能多的匹配字符,而且允许后续的正则表达式继续匹配。 非贪婪性重复。在待匹配的字符后面跟着一个?,正则便会尽量少的匹配字符。

    // 贪婪匹配
    let reg2 = /\d+/
    let str2 = '123abc'
    let result2 = reg2.exec(str2) // 123 
    
    // 非贪婪匹配
    let reg3 = /\d+?/
    let str3 = '123abc'
    let result3 = reg3.exec(str3) // 1
    
    //特例
    let reg3 = /\d+?a/
    let str3 = '123abc'
    let result3 = reg3.exec(str3) // 123a
    

    上面特例出现的原因是正则总是会寻找字符串中第一个可能匹配的位置。由于匹配是从字符串的第一个字符开始的。所以不会考虑字符串的子串中更短的匹配。

  • 选择、分组和引用。

    • 选择符号 |
    let reg = /green|red/
    let str = 'apple green'
    let result = reg.exec(str); // green
    

    从左到右匹配,直到发现了匹配项。如果符号左边的匹配项被匹配,则会自动忽略右边的匹配项。及时它右边的也会匹配。

    • 分组 ()
      • 作用

        1. 把单独的项组合成一个字表达式。以便可以用重复性字符或选择符来进行处理。
        2. 在完整的模式中引用子模式。当一个正则表达式成功地和目标字符串相匹配时,可以从目标串中抽出和圆括号中相匹配的部分。
        3. 允许在同一正则表达式的后部引用前面的子表达式。在执行过程中用 "\n" 来实现,n 代表圆括号的子表达式在正则表达式中的位置,同理,在执行过后,可通过 $n 来表示。就是参与计算的左括号的位置。
            // 匹配 spider || spiderMan
            let reg = /(spider)?Man/ 
            // 可获取圆括号中子表达式的子串
            let reg = /(\w+)\s(\w+)/
            let str = 'spider Man' 
            let result = reg.exec(str)
            // 获取执行中的引用
            let reg = /(\w+)\s(\w+)\s\1/
            var str = 'spider Man spider' 
            let result = reg.exec(str)
            // 获取执行过后引用
            let reg2 = /(\w+)\s(\w+)/
            var str2 = 'spider Man spider' 
            let replaceStr = str2.replace(reg2,'$2 $1')
        

        如果不想让组表达式产生引用。可以用 (?😃 来进行分组。

            let reg = /(?:\w+)\s(\w+)\s\1/
            var str = 'spider Man Man' 
            let result = reg.exec(str)
        

    总结:| () (?😃 \n

# 4 修饰符

对匹配的规则进行说明

  • i (case-insensitive) 不区分大小写模式
  • g (global) 模式应用于所有字符串,而非在发现第一个匹配时立即停止。
  • m (multiline) 多行模式。到达文本的末尾时会继续查找下一行中是否存在和模式匹配的串。

# 5 正则实例的属性和方法

# 1 正则实例的属性

  • source 只读 字符串 正则表达式的文本
  • global 只读 布尔值 是否带有标志 g
  • ignoreCase 只读 布尔值 是否带有标志 i
  • multiline 只读 布尔值 是否带有标志 m
  • lastIndex 可读写 整数 如果带有 g 修饰符。表示开始搜索下一匹配项的字符位置,从 0 算起。

# 2 正则实例的方法

  • exec()

    • 作用 在一个字符串中进行匹配检索。
    • 参数 引用字符串
    • 返回 包含第一个匹配项信息的数组。没有匹配项返回 null。
    • 特点
      • 不设置 g 修饰符。多次匹配始终返回第一个匹配项。设置 g 修饰符。下一次调用会在字符串中继续查找匹配项。
    let text2 = 'cat, bat, sat, fat'
    let pattern2 = /.at/g
    let result1 =  pattern2.exec(text2)
    let result2 =  pattern2.exec(text2)
    console.log(result1);
    console.log(result2);
    console.log(pattern2.lastIndex)
    

    -w477

  • test()

    • 作用 检测字符串是否与模式匹配
    • 参数 引用字符串
    • 返回 布尔值

# 6 可用于模式匹配的字符串方法

  • search()
    • 作用 返回第一个与之匹配的子串的起始位置
    • 参数 正则表达式
    • 返回 第一个子串所匹配的起始位置。找不到返回 -1
    • 特性
      • 如果参数不是正则表达式,会默认同 RegExp 将它转换成正则表达式
    • 缺点
      • 不支持全局检索。它会忽略正则表达式参数中的修饰符 g。
    let re = /man/i
    let str = 'spider man'
    let result = str.search(re) // 7
  • replace(reg,str)
    • 作用 执行字符串的检索和替换操作
    • 参数 第一个是正则表达式,第二个是要进行替换的字符串
    • 返回 返回一个新字符串。其中,与源串中模式匹配的子串,将会被第二个参数替换
    • 特性
      • 可以设置修饰符 g。
        • 设置g。所有与模式匹配的子串都将会被替换
        • 不设置g。只替换所匹配的第一个子串
      • 如果第一个参数不是正则表达式,责会直接搜索这个字符串,不会调用构造函数强转
      • 第二个参数中如果出现了 $n 字符,将会用指定的子表达式相匹配的文本来替换这两个字符
      • 第二个参数可以是一个函数,该函数能动态地计算替换字符串
  • match(reg)
    • 作用 检索返回一个字符串匹配正则表达式的结果
    • 参数 正则表达式
    • 返回
      • 未使用g,返回第一个完整匹配及其相关匹配组。格式为数组
      • 使用g,返回与完整表达式匹配的所有结果,但不会返回捕获组。
    • 特性
      • 如果参数不是正则表达式,则会隐士的调用构造函数创建一个正则对象
      • 如果不设置 g 标志,返回值与 exec 方法一致。
  • split(spa,limit)
    • 作用 用指定的分隔符将字符串分割成一个字符串数组
    • 参数
      • spa 分隔符。可以为字符串或者正则
      • limit 一个整数,限定返回的分割片段数量
    • 返回 源字符串以分隔符出现位置分隔而成的一个 Array