JS 中的正则表达式(规则表达式)

224 阅读4分钟

正则表达式

正则表达式又名“规则表达式”。
是由我们来书写 “规则”,专门用来检测  字符串  是否符合 “规则” 使用的。
我们使用一些特殊的 字符 或者 符号  定义一个 "规则公式", 然后用我们定义好的 "规则公式" 去检测   字符串 是不是合格。
正则表达式的符号有两种符号组成:
         1.元字符
             正则的规则符号
                 普通文本---正则的规则符号
         2.修饰符
             修饰整个正则表达式的符号

创建正则表达式

1. var reg = /此处为正则/
    例:var reg = /abc/
2. var reg = new RegExp('此处为正则')
    例: var reg1 = new RegExp('abcd')

正则表达式的常用方法

1. 匹配

    关键字: test
            匹配字符串是否符合正则规则
    返回结果: 
            true   --> 符合规则
            false  --> 不符合规则
例:
    var reg = /werl/

    var str1 = 'qwerl'
    var str2 = 'moqlwienr2'
    var str3 = 'lomjwerlt3'

    console.log(reg.test(str1))  //true
    console.log(reg.test(str2))  //false
    console.log(reg.test(str3))  //true

2.捕获

    语法: 正则.exec(字符串)
    1. 字符串没有符合正则规则的内容
            捕获结果为 null
       例: var reg = /\d{3}/
           console.log(reg.exec('qwertyuiop'))

    2. 正则没有小括号, 没有标识符 g 
            捕获到的是一个 数组, 下标 0 是我们捕获到的值, 但是不管捕获多少次, 都是从 下标[0]开始, 第一个满足条件的
       例: var reg = /\d{3}/
           console.log(reg.exec('qwe123rtyu456iop999'))
           console.log(reg.exec('qwe123rtyu456iop999'))
            
    3. 有小括号
            下标0 是符合正则规则的字符串
            从 下标1 开始, 每个小括号单独捕获出来的内容
       例: var reg = /(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/
           var num = '130432199505020056'
           console.log(reg.exec(num))
           
    4. 有标识符 g
            g 叫做全局标识符
            第二次捕获的时候, 会从第一次捕获结束的位置开始进行捕获
            直到找不到内容, 会返回一个 null
            然后在下一次捕获的时候, 会从字符串开始位置重新捕获
       例: var reg = /\d{3}/g
           var str = 'qwe123rtyu456iop999'
           console.log(reg.exec(str))    //[0]:123
           console.log(reg.exec(str))    //[0]:456
           console.log(reg.exec(str))    //[0]:999
           console.log(reg.exec(str))    //null
           console.log(reg.exec(str))    //[0]:123
           

正则表达式的元字符

一、普通元字符

1. \d    表示匹配(包含) 一位 数字(0~9)
    例: var reg = /\d/    //匹配 字符串中 包含一位 数字
        console.log(reg.test('abcd'))  //false
        console.log(reg.test('qwe25f'))  //true

2. \D    表示匹配(包含) 一位 非数字(0~9以外)
    例: var reg = /\D/
        console.log(reg.test('abcd')) //true
        console.log(reg.test('qwe25f'))  //true
        console.log(reg.test('15235422')) //false
        console.log(reg.test(' '))  //true
        console.log(reg.test(''))   //false

3. \s    表示匹配(包含) 一位 空白内容(空格,缩进)
    例: var reg = /\s/
        console.log(reg.test('sknnggi25455n'))  //false
        console.log(reg.test('skfdsf 2665safjh'))  //true
        console.log(reg.test(''))  //false
        
4. \S    表示匹配(包含) 一位 非空白内容
    例:  var reg = /\S/
        console.log(reg.test('vddiw125 sjdhsa')) //true
        console.log(reg.test('sjdaf1saf52fas'))  //true
        console.log(reg.test(' ')) //false
        console.log(reg.test(''))  //false

5. \w    表示匹配(包含)  一位 数字(0~9)字母(a~zA~Z)下划线(_)
    例: var reg = /\w/
        console.log(reg.test('彭于晏')) //false
        console.log(reg.test('彭于晏 eddie')) //true
        console.log(reg.test('#@%$^#&')) //false
        console.log(res.test('12sfsf_sad')) //true

6. \W    表示匹配(包含)  一位 非数字字母下划线
    例: var reg = /\W/
        console.log(reg.test('彭于晏')) //true
        console.log(reg.test('Eddie _ #$@@##'))  //true
        console.log(reg.test('sadasfxz'))  //false
        console.log(reg.test(' '))  //true
        
7.  .    表示匹配(包含)  一位 非换行的任意字符
    例: var reg = /./
        console.log(reg.test('\n'))  //false    \n 在 JS 中代表换行
        console.log(reg.test('qwert'))  //true
        console.log(reg.test('152as5dc'))  //true
        console.log(reg.test('@#$%&'))   //true
        
8.  \    表示转译符号, 把有意义的 符号 转换成没有意义的 字符 , 把没有意义的 字符 转换成有意义的 符号
    例: var reg = /\d\.\d/      // \. 表示一个小数点, 没有任何特殊含义
        console.log(reg.test('qwe'))  //false
        console.log(reg.test('6.9'))  //true
        console.log(reg.test('c.e.5.30'))  //true
        console.log(reg.test('s.f'))  //false
        console.log(reg.test('200'))  //false

二、边界元字符

 1. ^  表示开头
     例: var reg = /^\d/   //表示 字符串开头需要是一个数字
         console.log(reg.test('999zzz'))  //true
         console.log(reg.test('zzz999'))  //false
            
 2. $  表示结尾
     例: var reg = /$\d/    //表示字符串结尾需要是一个数字
         console.log(reg.test('999zzz'))  //false
         console.log(reg.test('zzz999'))  //true
         
 例:  var reg = /^qwer$/   //表示字符串中 必须是 qwer
      console.log(reg.test('qwert'))  //false    
 注: 当 开头和结尾 同时使用时, 表示字符串 必须是 规则里的内容 

三、限定元字符

       限定了 前一个符号 出现多少次
       
 1. *       表示 0~正无穷 次
     例: var reg = /^\d*$/
         console.log(reg.test('qwer'))  //false
         console.log(reg.test('_999'))  //false
         console.log(reg.test('999'))   //true
         
 2. +       表示 1~正无穷 次
     例: var reg = /^\d+$/
         console.log(reg.test('abc'))   //false
         console.log(reg.test('_999'))  //false
         console.log(reg.test('999'))   //true
         console.log(reg.test(' '))     //false
         console.log(reg.test('!'))     //false
         
 3. ?       表示 0~1 次
     例: var reg = /^\d?$/
         console.log(reg.test('6'))  //true
         console.log(reg.test('99')) //false
         
 4. {n}     表示 限定 n 次
     例: var reg = /^\d{3}$/
         console.log(reg.test('6'))    //false
         console.log(reg.test('99'))   //false
         console.log(reg.test('999'))  //true
         console.log(reg.test('9999')) //false
         
 5. {n,}    表示 限定 最少 n 次
     例: var reg = /^\d{n,}$/
         console.log(reg.test('6'))    //false
         console.log(reg.test('99'))   //false
         console.log(reg.test('999'))  //true
         console.log(reg.test('9999')) //true

 6. {n,m}   表示 限定 最少 n 次,最多 m 次
     例: var reg = /^\d{2,5}$/
         console.log(reg.test('6'))      //false
         console.log(reg.test('99'))     //true
         console.log(reg.test('999'))    //true
         console.log(reg.test('9999'))   //true
         console.log(reg.test('99999'))  //true
         console.log(reg.test('999999')) //false
      

特殊元字符

1. ()
    含义1: 单独捕获
    含义2: 一个整体
    例: var reg = /^(abc){2}$/  //要求字符串中 'abc'出现两次
        console.log(reg.test('abc'))  //false
        console.log(reg.test('abcabc')) //true 
        console.log(reg.test('abcqwe'))  //false
        console.log(reg.test('abcqwerabc'))  //false

2. |
    含义: 或
    例: var reg = /a|b/
        console.log(reg.test('a'))  //true
        console.log(reg.test('b'))  //true
        console.log(reg.test('c'))  //false
        console.log(reg.test('ab')) //true
        console.log(reg.test('aqwrqfjb'))  //true
    
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('w')) //true
          
5. -
    含义: 到  至
          通常和 []  [^] 连用
          /[0-9]/    正则代表的含义  数字0~9, 等价于 \d
          /[^0-9]/   正则代表的含义  非数字0~9, 等价于\D
          /[a-z]/    表示字母 a~z
          /[0-9a-zA-Z]  等价于  \w
      

元字符或的分界线

    或的分界线为 小括号 或者 正则的边界
        例:  var reg = /^abc|def$/
               * 分析:
               *      /^abc|def$/     
               *        ^abc    或者    def$ 
             console.log(reg.test('abc545214d'))    //true
             console.log(reg.test('jdhfd558def'))   //true
             console.log(reg.test('5254defasffa'))  //fasle
             console.log(reg.test('abc58465def'))   //true
             
             var reg = /^ab(c|d)ef$/
               * 分析
               *     ^ab    c      ef$
               *     ^ab    d      ef$
             console.log(reg.test('abcef'))     //true
             console.log(reg.test('abccef'))    //false
             console.log(reg.test('abdef'))     //true
             console.log(reg.test('abcdef'))    //false
             console.log(reg.test('qwef'))      //false
             console.log(reg.test('abkomlef'))  //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
     console.log(reg.test('defabc'))    //false
     

标识符(修饰符)

 书写在正则外面, 用来描述整个正则表达式
 1. i     表示忽略大小写
     例: var reg = /^[abcd]$/i
         console.log(reg.test('A'))   //true
         console.log(reg.test('a'))   //true
 2. g     表示 全局
 

正则表达式的两大特性

1. 懒惰
    每次捕获 都是在  下标[0] 的位置开始捕获
    解决: 在正则后添加个全局标识符 g
2.贪婪
    每次捕获内容的时候, 尽可能的多去捕获内容
    解决: 使用非贪婪限定符  (在原有的限定符后添加一个?)
    
    贪婪限定符:
                *
                +
                ?
                {n,}
                {n,m}
    非贪婪限定符:
                *?
                {n,}?