【JS】正则表达式的一些基本应用

270 阅读2分钟

前言

regExp: regular expression:是一个js内置的类

  • 专门用来处理字符串的
  • 就是一个规则,用来检验字符串是否属于这个规则(test),也可以把符合规则的字符串捕获到(exec)
let reg = /\d+/; // 0-9之间的数字出现1到多次
 console.log(reg.test('12')); // true
console.log(reg.test('d12fg')); // true
console.log(reg.exec('d12fg')); // [0:'12',......]

正则的组成

元字符

正则的元字符:量词元字符 特殊元字符 普通元字符

 量词元字符:
           *:0到多次
           +:1到多次
           ?:出现01次
           {n}:出现n次
           {n,}:至少出现n次
           {n,m}:出现n到m次
 特殊元字符(带*的是常用的)
           \:转义字符,把普通的元字符转化为特殊的元字符,还可以把特殊的元字符转化为普通的元字符
           .:任意字符(除了换行符)
           ^:以什么什么开头   *
           $:以什么什么结尾   *
           \n:换行符
          \d0-9之间的任意数字   *
           \D:非0-9之间的任意数字
           \w:数字、字母、下划线
           \t: 制表符
           \b:单词边界
           \s: 空白符
           x|y:取x或者y其中的任意一个   *
           [a-z]: az中的任意一个字母  [0-9]+  \d+  [A-Z]   *
           [a-z,A-Z,0-9]:a-z或者A-Z或者0-9之间的任意字符    *
           [@#]:@或者#中的任意一个字符
           [^a-z]:除了a-z之外的任意字符

           ():分组        *
           (?:):只匹配,不捕获     *
           (?=):正向预查
           (?!):负向预查
   普通元字符:除特殊元字符以外的
       如: b n d  e
        

修饰符

正则的修饰符:
     i-->ignoreCase :不分区大小写
     m-->multiline:多行匹配
     g-->global:全局匹配    *
         let reg = /^f$/i;

正则的使用

test:检测当前字符串是否可以用当前正则进行匹配,如果匹配成功就返回true,否则返回false

1、以什么开头: ^

以什么结尾: $

     let reg = /18$/; // 以18结尾
     console.log(reg.test('189')); // false
     console.log(reg.test('198')); // false
     console.log(reg.test('234567818')); // true
--------------------------------------------------------------------------------  
     let reg = /^18/; // 以18开头
     console.log(reg.test('189')); // true
     console.log(reg.test('198')); // false
     console.log(reg.test('18234567818')); // true

--------------------------------------------------------------------------------  
     let reg = /^18$/; // 以18开头并且以18结尾
     console.log(reg.test('189')); // false
     console.log(reg.test('198')); // false
     console.log(reg.test('1845618')); // false
     console.log(reg.test('1818')); // false
     console.log(reg.test('18')); // true
--------------------------------------------------------------------------------  
     let reg = /^\d{2}$/; // 0-9之间的数字出现两次
     console.log(reg.test('e2')); // false
     console.log(reg.test('2e')); // false
     console.log(reg.test('2e2')); // false
     console.log(reg.test('22')); // true
     console.log(reg.test('57')); // true

    // 如果 ^ $ 都不加,那只要字符串中出现符合规则的字符就可以
    //如果加上 ^ $那匹配的字符必须跟正则里规则一样才可以 

2.转义字符 \

 let reg = /^2.3$/; // 以2开头,中间任意字符,以3结尾
    //  . 除了换行符之外的任意字符
    console.log(reg.test('2.3')); // true
    console.log(reg.test('2e3')); // true
    console.log(reg.test('2@3')); // true
--------------------------------------------------------------------------------  
   let reg = /^2\.3$/; // '2.3'
   // 把特殊元字符转化为普通元字符
    console.log(reg.test('2.3')); // true
    console.log(reg.test('2e3')); // false
    console.log(reg.test('2@3')); // false
--------------------------------------------------------------------------------  
   // 把普通元字符转化为特殊元字符
    let reg = /^\d$/ // 0-9之间的数字

    let str = '中\\国'; // 转义字符在字符串里也适用(第一个\把第二个\转化为普通的字符串了)
    console.log(str);
--------------------------------------------------------------------------------  
    let reg = /^\\d$/; // 我只想匹配 '\d'
    console.log(reg.test('\\d')); // true

3、x|y:x或者y之间取一个

  let reg = /^18|29$/;
     console.log(reg.test('18')); // true
     console.log(reg.test('29')); // true
     console.log(reg.test('189')); // true
     console.log(reg.test('129')); // true
     console.log(reg.test('118219')); // false
     console.log(reg.test('1589')); // false
    // 直接写 x|y会产生很乱的优先级,一般咱们这样写的时候都会有()进行分组,小括号可以改变处理的优先级
--------------------------------------------------------------------------------    
     let reg = /^(18|29)$/;
     console.log(reg.test('18')); // true
     console.log(reg.test('29')); // true
     console.log(reg.test('129')); // false
     console.log(reg.test('189')); // false
     console.log(reg.test('1829')); // false

4、[]中不允许出现多位数,而且中括号一般都是普通含义

    let reg = /^[21-68]$/; // [2,1-6,8] // 从2或者1-6或者8中任意取一个
    console.log(reg.test('22')); // false
    console.log(reg.test('68')); // false
    console.log(reg.test('2')); // true
    console.log(reg.test('5')); // true
    console.log(reg.test('228')); // false
--------------------------------------------------------------------------------  
    // 而且中括号一般都是普通含义
     let reg = /^[.]$/; // .就是普通元字符
     console.log(reg.test('.')); // true
     console.log(reg.test('1')); // false
--------------------------------------------------------------------------------  

     let reg = /^[\d]$/; // \d还是特殊意义的元字符
     console.log(reg.test('6')); // true
     console.log(reg.test('1')); // true
--------------------------------------------------------------------------------  
    // 年月日

    // 匹配身份证中的年份
      // - 四位数
      // - 前一位应该是1或者2
      // - 后边随便了


      // 2001   1995 1993 1990 

       let reg = /^[1-2](\d{3})$/;

       let reg = /^[1-2]\d{3}$/


      // 月: 01-12   01-09   10-12
      // 01-09   0[1-9]
      // 10-12   1[0-2]

       let reg = /^(0[1-9]|1[0-2])$/ // 匹配月份
       let reg1 = /^(0[1-9]|10|11|12)$/ // 匹配月份

      // 日:01-31    01-09  10-29  30-31
                    // 01-09  10-19  20-29 30-31
       let reg = /^(0[1-9]|[1-2][0-9]|3[0-1])$/;
       let reg1 = /^(0[1-9]|1[0-9]|2[0-9]|3[0-1])$/;

5、():分组

//  1、提高匹配的优先级
//  2、分组引用
--------------------------------------------------------------------------------  
      let str = 'moon' // 'seew';  'meeeo'
     // ([a-z])\1:把刚才小括号里出现的字符再重新出现一次
      let reg = /^[a-z]([a-z])\1[a-z]$/;
     console.log(reg.test('moon')); // true
--------------------------------------------------------------------------------  
   // 让第一次分组的内容再次出现两次
     let reg = /^[a-z]([a-z])\1\1[a-z]$/;
     console.log(reg.test('mooon')); // true
--------------------------------------------------------------------------------  

      let str1 = 'abab';
     let reg =  /^([a-z][a-z])\1$/;
               // /^([a-z]{2})\1$/
             //  /^([a-z])([a-z])\1\2$/;
    console.log(reg.test('abab')); // true