正则

188 阅读5分钟

正则表达式(规则表达式)

用来检测字符串是否符合规则

一.创建正则

1.字面量创建

var reg = /正则写在这里/

var reg = /abc/
console.log(reg);

2.构造函数创建

var reg = new RegExp('正则写在这里')

var reg2 = new RegExp('abc')
console.log(reg2);

二.正则常用方法

1.匹配 : 正则.test(字符串) : 匹配字符串是否符合正则规则,返回布尔值

  • true : 符合规则
  • false : 不符合规则
        var reg = /abc/  // 匹配一段字符串中是否符合'abc'

        var str1 = 'a'
        var str2 = 'ab'
        var str3 = 'abc'
        var str4 = 'abcd'
        var str5 = 'a1b2c3'

        console.log(reg.test(str1))  // false
        console.log(reg.test(str2))  // false
        console.log(reg.test(str3))  // true
        console.log(reg.test(str4))  // true  包含abc了
        console.log(reg.test(str5))   // false 包含要连在一块,需要连贯

2. 捕获(还原) : 正则.exec(字符串)

(1) . 字符串没有符合正则规则的内容
  • 捕获结果为 null
        var reg = /\d{3}/  // 有三个数字即可
        console.log(reg.exec('hshsfhihs'));   // null 没有相关的东西
(2) . 正则没有小括号,没有标识符g
  • 捕获到的是 一个数组 下标0是 我们捕获到的值,但是不管捕获多少次,都是从 下标0 开始,第一个满足条件的
        var reg = /\d{3}/  // 有三个数字即可
        console.log(reg.exec('hsh678hihs123ffs345'));   // 678
        console.log(reg.exec('hsh678hihs123ffs345'));   // 678

(3). 有小括号

  • 下标0 是符合正则规则的字符串
  • 从下标1 开始, 每个小括号单独捕获出来的内容
        var reg = /\d{2}/   // 两位数字
        var reg = /(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/  
        var sum = '142622200310021234'
        console.log(reg.exec(sum));

(4) . 有标识符 g

  • g 叫做 全局标识符
  • 第二次捕获时, 会从第一个捕获节点胡的位置开始进行捕获, 直到找不到内容, 会返回一个null
  • 下一次再捕获, 会从字符串开始位置重新捕获
        var reg = /\d{3}/g
        var str = 'hsh678hihs123ffs345'
        console.log(reg.exec(str));   // 下标0 的值 678
        console.log(reg.exec(str));   // 下标0 的值 123
        console.log(reg.exec(str));   // 下标0 的值 345
        console.log(reg.exec(str));   //  null
        console.log(reg.exec(str));   //  重新捕获

三.正则的元字符 : 包含一位就好!!!

正则表达式的符号,由两种方式组成:

1. 元字符 : 正则规定的符号

普通文本(abc)和正则的规定符号(\ .)

2. 修饰符 : 修饰整个正则表达式的符号
  • 普通元字符:

  1. \d : 表示 一位 数字 (0 ~ 9)
        var reg = /\d/  // 表示匹配字符串中 包含一位数字
        console.log(reg.test('abcd')); // false  是字符,规则是数字
        console.log(reg.test('abcd#$%')); // false
        console.log(reg.test('12345'));  // true  包含数字
  1. \D : 表示 一位 非数字 (除了0 ~ 9)
        var reg = /\D/  // 表示匹配非数字
        console.log(reg.test('abcd')); // true
        console.log(reg.test('abcd#$%')); // true
        console.log(reg.test('12345'));  // false
  1. \s : 表示 一位 空白内容 (空白,缩进)
        var reg = /\s/
        console.log(reg.test('1234#%@')); // false  没有空白
        console.log(reg.test('12324 @#$%')); //true  有一位空白内容就是true
  1. \S : 表示 一位 非空白内容 (有内容就为true,无内容为false)
        var reg = /\S/
        console.log(reg.test('1234#%@')); //true 没有空白为true
        console.log(reg.test(' 1 2 3 4 # % @ # ')); // true  有内容
        console.log(reg.test('1234#%@#')); // true   有内容
        console.log(reg.test(' ')) // false  非空白没有空白为true,有空白则为false
  1. \w : 表示 一位 数字(0~9)字母(a-zA-Z)下划线(_)
        var reg = /\w/   //表示一位  数字(0-9)字母(a-zA-Z),下划线(_)
        console.log(reg.test('abc')); // true  包含字母
        console.log(reg.test('a1b2c3')); // true  包含字母,数字
        console.log(reg.test('a1b2c3_')); // true  包含字母,数字,下划线
        console.log(reg.test('#$%')); // false  没有数字,字母,下划线
  1. \W : 表示 一位 非数字字母下划线
        var reg = /\W/  //表示一位  非数字字母下划线内容
        console.log(reg.test('abc'));  //false  匹配非数字字母下划线
        console.log(reg.test('abc123')); //false
        console.log(reg.test('abc123_')); //false
        console.log(reg.test('#$%^'));  // true
        console.log(reg.test(' '));  // true
  1. . : 表示 一位 非换行内容
        var reg = /./  //表示一位  非换行内容
        console.log(reg.test('#$%^'));  //true 没有换行
        console.log(reg.test('adfgd'));  //true 没有换行
        console.log(reg.test('12345'));  //true  没有换行
        console.log(reg.test('\n'));  //false  \n: 在 js 中表示换行
  1. \ : 表示 转义
        var reg = /\d\.\d/  //  \. : 表示一个小数点没有特殊含义
        
        // var reg = /4.5/
        // var reg = /\d\.\d/ // 表示小数

        console.log(reg.test('abc'));  // false 不是小数
        console.log(reg.test('5.4'));  // true  是小数
        console.log(reg.test('100'));  // false  没有小数点

四.正则的边界元字符

1. ^ : 表示开头

        var reg = /^\d/  // 表示字符串开头必须是数字
        console.log(reg.test('100avbd')); // true  开头是数字
        console.log(reg.test('acavd333'));  //false

2. $ : 表示结尾

        var reg = /\d$/  // 表示字符串结尾是一位数字
        console.log(reg.test('100avbd')); // false
        console.log(reg.test('acavd333'));  //true  结尾是数字

当 开头与结尾 共同使用时,表示 字符串 必须是 规则里的内容

        var reg = /abc/  // 表示 字符串 中包含 'abc'
        console.log(reg.test('abcd')); // true

        var reg = /^abc$/  // 表示字符串必须是abc
        console.log(reg.test('abcd')); // false

五.正则的限定元字符

限定了 前一个符号 出现多少次

1. * : 表示 0 ~ 正无穷次

        var reg = /^\d*$/  // 表示数字可以出现0 ~ 正无穷次
        console.log(reg.test('abc'));  // false  只能是数字!!!
        console.log(reg.test('_99'));  // false  只能是数字!!!
        console.log(reg.test('666'));  // true 

2. + : 表示 1 ~ 正无穷次

        var reg = /^\d+$/ // 表示 1 ~ 正无穷次
        console.log(reg.test('abc'));  // false  只能是数字!!!
        console.log(reg.test('_99'));  // false  只能是数字!!!
        console.log(reg.test('666'));  // true 
        console.log(reg.test(' '));  // false  只能是数字!!!
        console.log(reg.test('!'));  // false  只能是数字!!!

3. ? : 表示 0 ~ 1 次

        var reg = /^\d?$/ // 表示 0 ~ 1 次
        console.log(reg.test('6')); // true
        console.log(reg.test('66')); // false

4. {n} : 表示 限定 n 次

        var reg = /^\d{3}$/ // 表示 限定 3 次
        console.log(reg.test('6')); // false
        console.log(reg.test('66')); // false
        console.log(reg.test('666')); // true
        console.log(reg.test('6666')); // false

5. {n,} : 表示 限定 最少出现 n 次

        var reg = /^\d{3,}$/ // 表示 限定 最少 3 次 ,逗号后不要加空格!!!
        console.log(reg.test('6')); // false
        console.log(reg.test('66')); // false
        console.log(reg.test('666')); // true
        console.log(reg.test('6666')); // true

6. {n,m} : 表示 限定 最少出现 n 次,最多出现 m 次

        var reg = /^\d{3,4}$/ // 表示 限定 最少 3 次 ,最多 4 次 ,逗号后不要加空格
        console.log(reg.test('6')); // false
        console.log(reg.test('66')); // false
        console.log(reg.test('666')); // true
        console.log(reg.test('6666')); // true
        console.log(reg.test('12345')); // false  最多4次,出现了5次

六.正则的特殊元字符

1. () :

  • 含义1 : 单独捕获
  • 含义2 : 一个整体
        // var reg = /abc{2}/  // c 出现2次
        var reg = /(abc){2}/  // abc 出现2次
        console.log(reg.test('abc'));  // false
        console.log(reg.test('abcabc'));  // true
        console.log(reg.test('abcffd'));  // false  abc 出现2次!!

2. | : 或

        var reg = /a|b/
        console.log(reg.test('a'));  // true
        console.log(reg.test('b'));  // true
        console.log(reg.test('c'));  // false  不存在!!

3. [] : 包含中括号内 其中一个即可

在中括号内可以书写任意数量的字符, 但是字符串只要满足其中一个即可

        var reg = /^[abcd]$/  // 字符串中包含 a b c d 任意一个即可
        console.log(reg.test('a'));  // true
        console.log(reg.test('b'));  // true
        console.log(reg.test('c'));  // true
        console.log(reg.test('d'));  // true
        console.log(reg.test('abcd'));  // false  只能包含其中一个

4. [^] : 非 或者 不包含

在中括号内可以书写任意数量的字符,只要字符串不是其中的某一个就行

        var reg = /^[^abcd]$/  // 字符串不包含a b c d 即可
        console.log(reg.test('a'));  // false
        console.log(reg.test('c'));  // false
        console.log(reg.test('f'));  // true  不是其中任何一个为true

5. - : 到 或者 至

通常和 []包含 [^]不包含 连用

     /[0-9]/   正则代表的含义  数字0-9    等价于 \d
     /[^0-9]/  正则代表的含义  非数字0-9  等价于 \D
     /[a-z]/     表示字母a-z
     /[0-9a-zA-Z]/  等价于\w

七.元字符或的分界线在哪里?

或的分界线为 小括号 或者 正则的边界

1. 正则的边界

        var reg = /^abc|def$/
        // 分析: ^abc  或者  def$     
        console.log(reg.test('abc1233'));  //true
        console.log(reg.test('1233def'));  //true
        console.log(reg.test('123abcdef3'));  //false  开头和结尾不匹配

2. 小括号的边界

        var reg = /^ab(c|d)ef$/
        /*
          分析:
             ^ab  c  ef$
             ^ab  d  ef$ 
        */
        console.log(reg.test('abcef'));  //true
        console.log(reg.test('abdef'));  //true
        console.log(reg.test('hhvf'));  //false
        console.log(reg.test('abdhih'));  //false

八.正则的重复元字符

  • 符号 : \数字
  • 符号 : \1 \2 \3
  • 含义 : 表示 重复 第n个 小括号的内容, 并且要求和小括号内容完全一致
        var reg = /^(abc|def)\1$/
        /*
        //   \1 : 重复前边第一个小括号的内容,小括号内如果是'abc' 那么\1 的值也需要时'abc
        */
         console.log(reg.test('abcabc'));  // true
         console.log(reg.test('defdef'));  // true
         console.log(reg.test('abcdef'));  // false  abc符合 \1 应该是abc
         console.log(reg.test('defabc'));  // false   def符合 \1 应该是def  

要求 字符串是 span 标签或者 p 标签

       /* 
          流程:
              1. var reg = /<span></span>/  
                !!!因为 span 的结束标签前有一个 /  js会把它识别为正则的结束, 所以需要加一个转义符
              2. var reg = /<span><\/span>/
                !!! 因为 span 或者 p 标签都可以, 所以需要将 span 标签开头加一个 元字符 或|
              3. var reg = /<span|p><\/span>/
                !!! 因为 结束标签的文本一定要和开始标签相同, 所以可以在结束标签后写一个 \1 ,表示重复第一个小括号的内容
              4. var reg = var reg = /<(span|p)><(\/\1)>/
        */
        var reg = /<(span|p)><(\/\1)>/
        console.log(reg.test('<span></span>')); // true
        console.log(reg.test('<p></p>'));  // true
        console.log(reg.test('<div></div>')); // false

九.正则的标识符

书写在正则的外面,用来描述整个正则表达式

1. i : 表示忽略大小写

       // var reg = /^[abcd]$/  // abcd 其中任意一个,必须是小写
        var reg = /^[abcd]$/i  // abcd 其中任意一个,大小写都可
        console.log(reg.test('a'));  // true
        console.log(reg.test('A'));  // true
        console.log(reg.test('w'));  // false

2. g : 全局

十.案例练习

案例需求 : 将 字符串内 所有满足正则规则的片段 全部捕获出来,放到一个数组内

        var reg = /\d{3}/g
        var str = 'qwe123asd456zxc789'
        /* 
        ['123','456','789']
        */

十一.正则的两大特性

1. 懒惰

  • 每次捕获 都是在 下标0 的位置开始捕获
  • 解决 : 在正则后添加全局标识符
       var str = '<div class="box" id="id_box"><span></span></div>'
       // 贪婪限定符
       var reg1 = /<div.*>/
       console.log(reg1.exec(str)[0]);

2. 贪婪

  • 每次捕获内容时, 尽可能多去捕获
  • 解决 : 使用非贪婪限定符 (在原有的限定符后添加一个?)
  • 贪婪限定符 : * , + , ? , {n,} , {n,m}
  • 非贪婪限定符 : +? , {n,}
       var str = '<div class="box" id="id_box"><span></span></div>'
       var reg2 = /<div.*?>/
       console.log(reg2.exec(str)[0]);