正则表达式-Regular Expression

139 阅读3分钟

正则表达式-Regular Expression

  • 作用:检验字符串是否符号规则

  • 是一个复杂数据类型,存储的是正则表达存储空间的地址

  • 特性

    • ①懒惰性:当你捕获内容时,每次默认从字符串开头位置检索,添加一个全局匹配g即可解决

    • ②贪婪性:

      • 贪婪匹配:尽可能的捕获更多,指的都是限定符;
      • 非贪婪匹配:尽可能的捕获更少,在每个限定符后面加上一个?即可

一、创建

(1)字面量方式

  • var reg = /qwer/

(2)内置构造函数

  • var reg = new RegExp('qwer')

(3)创建方式的区别

  • ①书写正则表达式标识符号的区别

    • 字面量:直接书写在正则的后面
    • 内置构造函数:以第二个参数的形式书写
     var reg1 = /qwer/gi;
     var reg2 = new RegExp('qwer','ig');
     console.log( reg1 )  // /qwer/gi
     console.log( reg2 )  // /qwer/gi
    
  • ②拼接变量的能力

    • 字面量:不能进行变量拼接
    • 内置构造函数:可以进行变量拼接
     var s = 'QQ';
     // var reg1 = '/^'+s+'$/';
     // console.log( reg1.test('QQ') ); // 报错  reg1是字符串而不是正则
     var reg2 = new RegExp('^'+s+'$');
     console.log( reg2.test('QQ') ) // true
    
  • ③书写基本元字符

    • 字面量:/\s\w/
    • 内置构造函数:new RegExp('\s\d\w')
     var reg1 = /\s\d\w/;
     var reg2 =new RegExp('\s\d\w');
     console.log( reg1 )  // /\s\d\w/
     console.log( reg2 )  // /\s\d\w/
    

二、标识符

  • 书写在正则外面,正则表达式后面

  • i,忽略大小写

     var reg = /^[a-z]$/i
     console.log( reg.test('a')  )  // true
     console.log( reg.test('b')  )  // true
     console.log( reg.test('A')  )  // true
     console.log( reg.test('B')  )  // true
    
  • g,全局匹配,和捕获一起使用才有效果

  • m,多行匹配,和捕获一起使用才有效果

三、常用方法

(1)test(),匹配方法

  • 语法:正则.test(检测的字符串)

  • 作用:检测字符串是否符号规则

  • 返回值:true 或 false

     var reg = /qwert/; // 检测的字符串中要包含 'qwert' 字符串片段
     var res1 = reg.test('qqwqwqqqrrrrtttttt');
     console.log( res1 ); // false
     var res2 = reg.test('qqwqwqqqrrrrttqwerttttt');
     console.log( res2 ) // true
    

(2)exec(),捕获方法

  • 语法:正则.exec(原字符串)

  • 作用:从传入的字符串中,获取到符合正则表达式规则的部分字符串片段

  • 返回值:

    • ①原字符串中没有符合正则要求的字符片段,返回 null

       var reg = /q{2}/;
       console.log( reg.exec('qwertqwert') ); // null
      
    • ②原字符串中有符合正则要求的字符片段,返回一个数组,[0]位置就是从原字符串中捕获的内容

      • 2.1、正则表达式中没有(),也没有全局标识符g

        • 返回值:只有数组[0]是正则捕获的字符片段
        • 不管捕获多少次,正则都是从原字符串开始的位置进行检索捕获
         var reg = /q{2}/;
         console.log( reg.exec('66qqwertqqwert') ); // qq
         console.log( reg.exec('66qqwertqqwert') ); // qq
         console.log( reg.exec('66qqwertqqwert') ); // qq
         console.log( reg.exec('66qqwertqqwert') ); // qq
        
      • 2.2、正则表达式中有()

        • 返回值:只有数组[0]是正则捕获的字符片段
        • [1]开始依次是每一个小括号的单独捕获内容
         var str = '身份证号: 10010820010202001x ';
         // 10 省份 01 市 08 县 2001 年份 02 月份 02 日期
         // 倒数第二位表示性别 奇数是男 偶数女
         var reg = /(\d{2})(\d{2})(\d{2})(\d{4})(\d{2})(\d{2})(\d{2})(\d)(\d|x)/
         console.log( reg.exec(str) );
        
      • 2.3、正则表达式中g

        • 返回值:只有数组[0]是正则捕获的字符片段
        • 从第二次捕获开始或从前一次捕获结束的位置开始检索,直到检索不到为止,返回null,在下一次又从原字符串的开始位置检索
         var str = 'qw123erty456uewrt789yuere';
         var reg = /\d{3}/g;
         console.log( reg.exec(str) ); // 123
         console.log( reg.exec(str) ); // 456
         console.log( reg.exec(str) ); // 789
         console.log( reg.exec(str) ); // null
         console.log( reg.exec(str) ); // 123
        

四、元字符

  • 正则表达式中用一个字符来表示一类内容

(1)基本元字符

  • \d,表示字符串中必须包含一位数字(0-9)

     var reg = /\d/
     console.log( reg.test('qewtrey') )  // false
     console.log( reg.test('qwerty1') )  // true
    
  • \D,表示字符串中必须包含一位非数字

     var reg = /\D/
     console.log( reg.test('66666') )  // false
     console.log( reg.test('1231a') )  // true
     console.log( reg.test('12_41') )  // true
    
  • \s,表示字符串中必须包含一位空白内容(空格、缩进、\n换行 也是空白)

     var reg = /\s/
     console.log( reg.test('213123') )  // false
     console.log( reg.test('123 231') ) // true
     console.log( reg.test('211\n231') ) // true
    
  • \S,表示字符串中必须包含一位非空白内容

     var reg = /\S/
     console.log( reg.test('\n') )     // false
     console.log( reg.test('  ') )     // false
     console.log( reg.test('12313') )  // true
     console.log( reg.test('21 34') )  // true
    
  • \w,表示字符串中必须包含一位数字(0-9)、字母(a-zA-Z)、下划线(_)任意内容

     var reg = /\w/
     console.log( reg.test('\n') )      // false
     console.log(reg.test('!#@'))       // fasle
     console.log( reg.test('dad_@#!') ) // true
    
  • \W,表示字符串中必须包含一位非数字、字母、下划线任意内容

     var reg = /\W/
     console.log( reg.test('1231312') ) // false
     console.log( reg.test('!@#@!#') )  // true
     console.log( reg.test('\n') )      // true
    
  • .,表示字符串中必须包含一位非换行的任意内容

     var reg = /./
     console.log( reg.test('\n\n\n\n') ) // false
     console.log( reg.test('\nwww\n666\n\n') ) // true
     console.log( reg.test('66777') ) // true
    
  • ⑧``,表示转义,将具有特殊函数的内容转义为普通内容

     var reg = /\d.\d/  // 需要包含 数字.数字
     console.log( reg.test('qwer.qwer') ) // false
     console.log( reg.test('123.qwer') ) // false
     console.log( reg.test('q123666ewrq') ) // false
     console.log( reg.test('q123.qwer') ) // false
     console.log( reg.test('q123.666ewrq') ) // true
    

(2)限定元字符

  • 限定前一个字符连续出现的次数

  • *,表示字符串中必须包含连续的内容 0~无数个

     var reg = /\d*/
     console.log( reg.test('') )  // true
     console.log(reg.test('1'))   // true
     console.log(reg.test('12'))  // true
    
  • +,表示字符串中必须包含连续的内容 1~无数个

     var reg = /\d+/
     console.log(reg.test('')) // false
     console.log(reg.test('1')) // true
     console.log(reg.test('12')) // true
    
  • ?,表示字符串中必须包含连续的内容 0~1 个

     var reg = /\d?/
     console.log(reg.test('')) // true
     console.log(reg.test('1')) // true
     console.log(reg.test('12')) // true
    
  • {n},表示字符串中必须包含连续的内容 n 个

     var reg = /\d{2}/
     console.log(reg.test('')) // false
     console.log(reg.test('1')) // false
     console.log(reg.test('12')) // true
     console.log(reg.test('1wr2')) // false
     console.log(reg.test('1wr2sfd3')) //false
     console.log(reg.test('14333')) // true
    
  • {n,},表示字符串中必须包含连续的内容 n~无数个

     var reg = /\d{2,}/
     console.log(reg.test('')) // false
     console.log(reg.test('1')) // false
     console.log(reg.test('12')) // true
     console.log(reg.test('1wr2')) // false
     console.log(reg.test('1wr2sfd3')) //false
     console.log(reg.test('14333')) // true
    
  • {n,m},表示字符串中必须包含连续的内容 n~m 个

     var reg = /\d{2,4}/
     console.log(reg.test('')) // false
     console.log(reg.test('1')) // false
     console.log(reg.test('12')) // true
     console.log(reg.test('1wr2')) // false
     console.log(reg.test('1wr2sfd3')) //false
     console.log(reg.test('14333')) // true
     console.log(reg.test('143')) // true
     console.log(reg.test('1436')) // true
    

(3)边界元字符

  • ^,表示字符串开始,写在正则表达式的最前面

     var reg = /^\d/; // 表示字符串只能 以一位数字开头
     console.log( reg.test('qwerty') ) // false
     console.log( reg.test('q1werty') )// false
     console.log( reg.test('q1werty1') )// false
     console.log( reg.test('1werty1') )// true
     console.log( reg.test('666werty1') )// true
    
  • $,表示字符串结束,写在正则表达式的最后面

     var reg = /\d$/; // 表示字符串只能 以一位数字结尾
     console.log(reg.test('qwerty')) // false
     console.log(reg.test('q1werty')) // false
     console.log(reg.test('q1werty1')) // true
     console.log(reg.test('1werty1')) // true
     console.log(reg.test('666werty166')) // true
    
  • 注意:当 ^$一起使用时,表示从开始到结束

    • 没有 ^$叫 包含
    • ^$叫 只能
     var reg = /^\d$/; // 表示字符串 从开始到结尾 只能是一位数字
     console.log( reg.test('qwert') ) // false
     console.log( reg.test('1aaaa') ) // false
     console.log( reg.test('1aaaa1') )// false
     console.log( reg.test('1111') ) // false 
     console.log( reg.test('11') )// false
     console.log( reg.test('1') )// true
     console.log( reg.test('9') )// true
     console.log( reg.test('0') )// true
     ​
     var reg = /^\d{3}$/; // 表示字符串 从开始到结尾 只能是三位连续的数字
     console.log( reg.test('qwrew') ) // false
     console.log( reg.test('q123etre') ) // // false
     console.log( reg.test('123etre') )// false
     console.log( reg.test('123') )// true 
     console.log( reg.test('123123') )// false
     ​
     var reg = /^9{3}$/; // 表示字符串 从开始到结尾 只能是 999
     console.log( reg.test('99') ) // false
     console.log( reg.test('999') )// true
     console.log( reg.test('99999') ) // // false
     console.log( reg.test('999wetru999') )// false
     console.log( reg.test('999999') )// false
    

(4)特殊元字符

  • (),表示一个整体,单独捕获

     var reg = /^(abc){2}$/; // 表示 只能匹配 'abcabc' 的字符串
     console.log( reg.test('abcabc') ) // true
     console.log( reg.test('abc666abc') ) // false
    
  • |(或),一般与()连用,只有()^$能区分 边界

     var reg = /^(asd|qwe)$/; // 表示字符串 只能是 asd或qwe
     console.log( reg.test('qwe') ) // true
     console.log( reg.test('asd') ) // true
     console.log( reg.test('asdqwe') ) // false
     ​
     var reg = /^asd|qwe$/; // 表示字符串 只能是 以 asd 开头 或者 qwe 结尾
     console.log( reg.test('qwe') ) // true
     console.log( reg.test('asd') ) // true
     console.log( reg.test('asdqwe') ) // true
     console.log( reg.test('asd666') ) // true
     console.log( reg.test('666qwe') ) // true
     console.log( reg.test('666') ) // false
    
  • [],写在 []内的任意一个字符都行(一个[]只占一个位置)

     var reg = /^[asd]$/; // 字符串开头到结尾只能是一位字符串组成,可以是 a 或 s 或 d
     console.log(reg.test('a')) // true
     console.log(reg.test('s')) // true
     console.log(reg.test('d')) // true
     console.log(reg.test('A')) // false
     console.log(reg.test('as')) // false
     console.log(reg.test('aa')) // false
    
  • [^],写在 []内的任意一个字符都不行(一个[^]只占一个位置)

     var reg = /^[^asd]$/; // 字符串开头到结尾只能是一位字符串组成,不可以是a或s或d中的任意一个
     console.log(reg.test('a'))// false
     console.log(reg.test('s')) // false
     console.log(reg.test('d')) // false
     console.log(reg.test('A')) // true
     console.log(reg.test('B')) // true
     console.log(reg.test('D')) // true
     console.log(reg.test('as')) // false
     console.log(reg.test('aa')) // false
    
  • -,表示范围,一般与[]连用

    • [0-9],表示一位数字;[a-z],表示一位小写字母;[A-Z],表示一位大写字母;[\U4e00-\u9fa5],表示一位中文
     var reg = /^[0-9]$/; // 字符串只能是一位数字
     console.log(reg.test('0')) // true
     console.log(reg.test('1')) // true
     console.log(reg.test('2')) // true
     console.log(reg.test('9')) // true
     console.log(reg.test('11')) // false
     console.log(reg.test('q')) // false
    

(5)断言元字符

  • ①前瞻断言

    • 前瞻肯定断言

      • 语法:x(?=y)
      • 作用:匹配 x,仅当后面跟着 y 时
       var reg = /\d(?=d)/; // 字符串中的包含 数字,且数字后必须跟个字符d
       console.log( reg.test('ddddd') )    // false
       console.log( reg.test('66666qqq') ) // false
       console.log( reg.test('dddd1dd') )  // true
      
    • 前瞻否定断言

      • 语法:x(?!y)
      • 作用:匹配 x,仅当后面不跟着 y 时
       var reg = /\d(?!d)/; // 字符串中的包含 数字,且数字后必须不能跟个字符d
       console.log( reg.test('ddddd') )      // false
       console.log( reg.test('66666qqq') )   // true
       console.log( reg.test('66666aweqq') ) // true
       console.log( reg.test('dddd1dd') )    // false
      
  • ②后瞻断言

    • 后瞻肯定断言

      • 语法:(?<=y)x
      • 作用:匹配 x,仅当跟在 y 后面时
       var reg = /(?<=d)\d/; // 字符串中的包含 数字,且数字必须跟在字符d后面
       console.log( reg.test('ddddd') )    // false
       console.log( reg.test('66666qqq') ) // false
       console.log( reg.test('dddd1dd') )  // true
      
    • 后瞻否定断言

      • 语法:(?<!y)x
      • 作用:匹配 x,仅当不跟在 y 后面时
       var reg = /(?<!-)\d+/; // 字符串中的包含 数字,且数字前不能有-字符
       console.log( reg.test('-1 -2 -3 -4 -5') )  // false
       console.log( reg.test('-1 -2 13 4 -5') )   // true
       console.log( reg.test('-1 -2 13 -5') )     // true
      

五、字符串方法

(1)replace()

  • 语法:字符串.replace(正则表达式,换上的字符)
  • 返回值:替换好的字符,当你传递的是正则表达式,并且有g全局匹配时,会全部替换
 var str = 'qwQQeryQQteyrQQytruQQtrur'
 var s = 'QQ'
 console.log( str.replace(s,'**') )     // qw**eryQQteyrQQytruQQtrur
 console.log( str.replace('QQ','**') )  // qw**eryQQteyrQQytruQQtrur
 console.log( str.replace(/QQ/,'**') )  // qw**eryQQteyrQQytruQQtrur
 console.log( str.replace(/QQ/g,'**') ) // qw**ery**teyr**ytru**trur

(2)search()

  • 语法:字符串.search(正则表达式)
  • 返回值:如果有该字符片段,则从字符片段的开始索引位置,没有则返回 -1
 var str = 'qwQQeryQQteyrQQytruQQtrur'
 console.log( str.search('QQ','**') )   // 2
 console.log( str.search('QQQ','**') )  // -1
 console.log( str.search(/QQ/,'**') )   // 2
 console.log( str.search(/QQ/g,'**') )     // 2
 console.log( str.search(/QQQ/g,'**') )    // -1

(3)match()

  • 语法:字符串.match(正则表达式)
  • 返回值:没有g的正则时,返回值和exec一样;有g的正则时,返回值是一个数组,里面是捕获的所有内容
 var str = 'qwQQ66eryQQ77teyrQQ88ytruQQ99trurQQewtert'
 console.log(str.match('QQ', '**'))
 console.log(str.match(/QQ/, '**'))
 console.log(str.match(/\d{2}/g, '**')) // ['66', '77', '88', '99']

\