js 正则

134 阅读4分钟

正则表达式

正则表达式,又称规则表达式 (相当于自己定义的一个 或 一组规则) 。
在代码中常简写为regex、regexp或RE,正则表达式通常被用来检索、替换、校验那些符合某个模式(规则)的文本 
(用于匹配字符串是否满足此规则)。

正则创建方式

  1. 字面量形式
const reg = /abc/;  
console.log(reg);  // /abc/
  1. 内置构造函数形式
const reg1 = new RegExp('abc');
console.log(reg1);   //  /abc/

正则的元字符

正则表达式的符号由那些组成?

  1. 元字符: 正则表达式的规则符号
  • 边界元字符
        1. ^    表示开头
        2. $    表示结尾
        const reg2 = /^\d/    // 表示字符串开头是一个数字
        console.log(reg2.test('abc123def')) // false
        console.log(reg2.test('123def'))    // true

        const reg3 = /\d$/    // 表示字符串结尾是一个数字
        console.log(reg3.test('abc123def')) // false
        console.log(reg3.test('abc123')) // true

        const reg4 = /^\d$/    // 表示字符串只能是一个数字
        console.log(reg4.test('abc123def')) // false
        console.log(reg4.test('123def'))    // false
        console.log(reg4.test('123'))       // false
        console.log(reg4.test('1'))         // true
  • 普通元字符
     1. \d       表示 一位(一个) 数字(0~9)
     2. \D       表示 一位 非数字(除了0~9)
     3. \w       表示 数字(0~9)字母(a-zA-Z)下划线(_) 其中的 一个
     4. \W       表示 除了 数字(0~9)字母(a-zA-Z)下划线(_)    这些的 某一个字符
     5. \s       表示 一位 空白字符
     6. \S       表示 一位 非空白字符
     7. .        表示 一位 非换行的任意字符
      8. \        表示转义符
      把有意义的符号, 转为 没有意义的文本
      将没有意义的文本, 转为 有意义的符号
      const reg1 = /\d/    // 表示字符串至少出现一个数字
      console.log(reg1.test('abc123def'))  // true
      
      const reg2 = /^\d/    // 表示字符串开头是一个数字
      console.log(reg2.test('abc123def')) // false
      console.log(reg2.test('123def'))    // true

      const reg3 = /\d$/    // 表示字符串结尾是一个数字
      console.log(reg3.test('abc123def')) // false
      console.log(reg3.test('abc123')) // true

      const reg4 = /^\d$/    // 表示字符串只能是一个数字
      console.log(reg4.test('abc123def')) // false
      console.log(reg4.test('123def'))    // false
      console.log(reg4.test('123'))       // false
      console.log(reg4.test('1'))         // true
  • 限定元字符
正则的 限定元字符
表示 前边一个 符号 出现多少次
    1. *        表示 0~正无穷次
    2. +        表示 1~正无穷次
    3. ?        表示 0~14. {n}      表示 限定 n 次, 不能多也不能少
    5. {n,}     表示 最少 n 次
    6. {n,m}    表示 最少 n 次, 最多 m 次
        const reg1 = /^\d*$/  // 这个字符串的数字只能出现 0~正无穷次
        console.log(reg1.test('1'))   // true
        console.log(reg1.test('1a'))   // false

        const reg2 = /^\d+$/ // 这个字符串的数字只能出现1~正无穷
        console.log(reg2.test('100'))    // true
        console.log(reg2.test('qwer'))    // false
        console.log(reg2.test('999qwer'))    // false

        const reg3 = /^\d?$/ // 这个字符串的数字只能出现 0~1 次
        console.log(reg3.test('666'))    // false
        console.log(reg3.test('6'))    // true

        const reg4 = /^\d{2}$/   // 这个字符串的数字只能出现 2 次
        console.log(reg4.test('666'))    // false
        console.log(reg4.test('66'))    // true
        console.log(reg4.test('6'))    // false

        const reg5 = /^\d{2,}$/   // 这个字符串的数字最少出现 2 次
        console.log(reg5.test('666'))    // true
        console.log(reg5.test('66'))    // true
        console.log(reg5.test('6'))    // false

        const reg6 = /^\d{2,3}$/   // 这个字符串的数字最少出现 2 次 最多出现3次
        console.log(reg6.test('6666'))    // false
        console.log(reg6.test('666'))    // true
        console.log(reg6.test('66'))    // true
        console.log(reg6.test('6'))    // false
  • 特殊元字符
正则的特殊元字符
    1. ()
        含义1: 当成一个整体
        
    2. |
        或
        字符为 或 左右两边的 都行
    3. []
        包含
        注意: [abcd]    包含其中一个即可    [] 实际代表的就是 一位字符
    4. [^]
        非
        注意: [^abcd]   只要不是他们四个中的一个即可    [^] 实际代表的就是 一位字符
    5. -
        到(至)
        通常与 包含  和  非  一起使用
         [0-9]   数字 0~9 中的一个           \d
         [^0-9]  不是数字 0~9 中的 一个      \D
         [a-z]   小写 字母a~z
         [A-Z]   大写 字母A~Z
  • 重复元字符
   正则的重复元字符
       符号: \1    \2  .... \9
       代表第几个小括号的值
       
       /(abc|def)\1/
         小括号 内 为 abc    \1 这个位置也需要是 abc
         小括号 内 为 def    \1 这个位置也需要是 def
        const reg = /^(abc|def)\1$/ // 小括号内是什么 \1 的位置就应该是什么
        console.log(reg.test('abcdef')) // false
        console.log(reg.test('abcabc')) // true
        console.log(reg.test('defabc')) // false
        console.log(reg.test('defdef')) // true

        const reg1 = /^(abc|def){2}$/   // 小阔内的内容, 出现两次, 但是每次的值, 可以不同
        console.log(reg1.test('abcdef')) // true
        console.log(reg1.test('abcabc')) // true
        console.log(reg1.test('defabc')) // true
        console.log(reg1.test('defdef')) // true

        const reg2 = /^<(p|span)><\/\1>$/
        console.log(reg2.test('<span></span>')) // true
        console.log(reg2.test('<p></p>'))   // true
        console.log(reg2.test('<p></span>'))    // false
    1. 修饰符
      (1). i: 匹配、搜索时不区分大小写 A和a是一样的

      (2). g: 查找所有项

      (3). m: 使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。

      (4). s: 默认情况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。

正则的常用方法

正则的常用方法

    1. 匹配
    • test
    • 匹配字符串是否符合正则规则
    • 符合 --- true
    • 不符合 --- false
    • 语法 正则.test(字符串)
        const reg = /abc/   // 要求字符串中 包含 abc
        const str = 'qwertyui'
        const str1 = 'qwertyuiabc'

        console.log(reg.test(str))  // false
        console.log(reg.test(str1))  // true
        console.log(reg.test('1234567890'))  // false
    1. 捕获
      1. 没有捕获到: 直接返回一个 null
      1. 捕获到了
      • 2.1 没有小括号也没g 的情况, 永远捕获的都是下标0开始的第一个符合条件的
      • 2.2 没有小括号, 但是有修饰符g 的情况
        • 第一次捕获完成后, 第二次开始的时候, 会从第一次捕获结束的位置开始
        • 第三次开始的时候, 会从第二次捕获结束的位置开始
        • 当所有的匹配项都匹配完成后, 会返回一个 null
      • 当再次捕获的时候, 就从下标0重新开始
      • 2.3 有小括号
        • 下标0 还是我们正常捕获到的内容
        • 从 下标1 开始, 就是每个小括号捕获到的内容
  • 没有小括号 也没有g
const reg = /\d{3}/;
// 1.没有捕获到
        console.log(reg.exec('axcvbnm'));  // null
        // 2. 没有小括号 也没有g
        console.log(reg.exec('z123rtu456gjvc000fgh555'));
        console.log(reg.exec('z123rtu456gjvc000fgh555'));
        console.log(reg.exec('z123rtu456gjvc000fgh555'));
        console.log(reg.exec         ('z123rtu456gjvc000fgh555'));
        console.log(reg.exec('z123rtu456gjvc000fgh555'));
        console.log(reg.exec('z123rtu456gjvc000fgh555'));
        // 没有加g 只能匹配第一个
        
  • 没有小括号 有g
const reg = /\d{3}/g;
// 没有小括号 有g
        console.log(reg.exec('z123rtu456gjvc000fgh555'));  /// 123
        console.log(reg.exec('z123rtu456gjvc000fgh555')); //456
        console.log(reg.exec('z123rtu456gjvc000fgh555')); //000
        console.log(reg.exec('z123rtu456gjvc000fgh555')); //555
        console.log(reg.exec('z123rtu456gjvc000fgh555')); // null
        console.log(reg.exec('z123rtu456gjvc000fgh555')); // 123

  • 有小括号
        // 有小括号
        const reg = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/;
        const str = '我的身份证号码是:512134201610230897 ,啦啦啦'
         console.log(reg.exec(str));  // 512134201610230897

正则的两大特性

    1. 懒惰
    • 正常捕获字符串的时候, 每次都从 下标0开始
    • 解决方式: 给正则添加一个修饰符 g
    1. 贪婪
    • 每次在捕获的时候, 会尽可能的多捕获一些东西

    • 解决:

      • 在原有的修饰符后添加一个 ? 然后相当于开启 非贪婪模式
    • 贪婪: 能多拿就多拿 ----- ( * + ? {n,} {n,m} )

    • 非贪婪: 能少拿就少拿 ----- ( *? +? ?? {n,}? {n,m}?)

        const str = '<div class="box" id="box1"><span></span></div>'

        const reg = /<div.*>/;   // 贪婪模式
        console.log(reg.exec(str));  // '<div class="box" id="box1"><span></span></div>'

        const reg1 = /<div.*?>/;    // 非贪婪模式
        console.log(reg1.exec(str));   // '<div class="box" id="box1">'