JS:正则表达式

一、创建正则表达式

  <script>
    // 什么是正则表达式 “规则表达式”
    // 就是我们通过一些符号和特殊符号组成一个模式
    // 用来检测字符串是不是符合我写的 “规则”
    // 怎么写一个正则
    
    // 字面量创建
    var reg1 = /\d{5,}@qq\.com/

    //内置构造函数创建
    var reg2 = new RegExp("\\d{5,}@qq\\.com")

    // 打印正则对象的字面量 类型(正则表达式 是一个引用数据类型)
    console.log(reg1, typeof(reg1)); ///\d{5,}@qq\.com/ 'object'
    console.log(reg2, typeof(reg2)); ///\d{5,}@qq\.com/ 'object'
  </script>

二、正则表达式的作用

1. 第一个正则方法 test()

语法: 正则表达式.test(你要检测的字符串)

返回值: 这个字符串如果符合规则,返回 true,如果不符合规则,返回 false

  <script>
    // 当你用这个正则取检测一个字符串的时候
    // 字符串必须包含一段字符叫做 'abc'
    // 如果字符串中有 'abc' 这样一段字符串,那么就符合规则,反之就是不符合规则
    var reg = /abc/

    // 1. 第一个正则方法
    // test()
    // 语法: 正则表达式.test(你要检测的字符串)
    // 返回值: 这个字符串如果符合规则,返回 true,如果不符合规则,返回 false

    var str1 = 'aabbccabcd'
    var str2 = 'defgaabbcc'
    // 测试str中是否有reg所定义的规则的子串
    var strIsOk1 = reg.test(str1)
    var strIsOk2 = reg.test(str2)

    console.log(strIsOk1, strIsOk2); //true false

  </script>

例子:

  <script>
    var regs = [/尼玛/, /握草/, /fucking/, /你妹/]

    var oneSay = "你妹啊,我的代码出bug了,fucking!"
    var twoSay = "谢谢老天!我的代码没问题啊!"

    function isGoodSay(say){
      var isGoodSay = true;
      for (let i = 0; i < regs.length; i++) {
        var reg = regs[i]
        if (reg.test(say)) {
          isGoodSay = false
          break
        }
      }
      return isGoodSay
    }

    console.log(oneSay, isGoodSay(oneSay) );
    console.log(twoSay, isGoodSay(twoSay) );
  </script>

三、正则表达式_元字符

  <script>
    // 就是用来书写正则的特殊内容

    // 1. \d 
    // 表示是数字的意思
    // 我要检测的字符串里面必须有一个数字
    // digit数字
    // reg.test(str)检测str中是否包含reg所描述的子串
    var reg = /\d/
    console.log(reg.test('abdsavcd')); //false
    console.log(reg.test('ab123vfdvcd')); //true

    // 2. \D
    // 表示非数字
    // 表示检测的字符串里面要有一个非数字
    var reg = /\D/
    console.log(reg.test('abcd')); //true
    console.log(reg.test('123')); //false

    // 3. \s 
    // 表示空格字符 " " \t制表符 \n换行符 \r回车符     
    // 表示你的字符串中要有一个 空格
    var reg = /\s/
    console.log(reg.test('SDfghjkz')); //false
    console.log(reg.test('1     23')); //true
    console.log(reg.test('deg\tgfh')); //true

    // 4. \S
    // 表示非空格
    var reg = /\S/
    var str1 = '1 23'
    var str2 = '  \t \n \r'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //false

    // 5. \w 单词字符
    // 数字字母下划线 0 - 9 a - z A -Z _
    var reg = /\w/
    var str1 = '0_aA'
    var str2 = '@你妹@'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //false

    // 6. \W
    // 非数字字母下划线
    var reg = /\W/
    var str1 = '@_@'
    var str2 = '123456sdfghjASFDFGHJ_'
    console.log(reg.test(str1));//true
    console.log(reg.test(str2));//false

    // 7. 点.
    // 表示非换行以外的任意字符 \n换行符
    var reg = /./
    var str1 = '你妹\n'
    var str2 = '\n \n \n'
    var str3 = '\n\n\n'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //true
    console.log(reg.test(str3)); //false

  </script>

四、正则表达式_限定符

  <script>
    // 限定符是来限制前面一个元字符出现的次数

    // 1. * 
    // 表示 0 次到 正无穷 [0, +∞]
    // 下面正则表示 \d 出现 0 ~ 正无穷次都可以
    var reg = /\d*/
    var str1 = 'abc12345'
    var str2 = 'abc1'
    var str3 = 'abc'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //true
    console.log(reg.test(str3)); //true

    // 2. +
    // 表示 1 次到正无穷次 [1, +∞]
    // 下面这则表示数字出现 1 ~ 正无穷次
    var reg = /\d+/
    var str1 = 'abc12345'
    var str2 = 'abc1'
    var str3 = 'abc'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //true
    console.log(reg.test(str3)); //false

    // 3. ?
    // 表示 0 ~ 1 次
    // 表示你检测的字符串里面有一段字符是 0 ~ 1 次的数字 [0,1]
    var reg = /\d?/
    var str1 = 'abc12345'
    var str2 = 'abc1'
    var str3 = 'abc'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //true
    console.log(reg.test(str3)); //true

    // 4. {n} n 是一个数字
    // 表示只能出现至少 n 次
    var reg = /\d{3}/
    var str1 = 'abc12345'
    var str2 = 'abc12'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //false

    // 5. {n,}
    // 表示至少出现 n 次   n ~ 正无穷次
    var reg = /\d{3,}/
    var str1 = 'abc12345'
    var str2 = 'abc45'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //false

    // 6. {n,m}  n ~ m 次
    // 表示出现 n ~ m 次
    var reg = /\d{2,4}/
    var str1 = 'abc12345354'
    var str2 = 'abc4'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //false

  </script>

五、正则表达式_边界符

  <script>
    // 1. ^
    // 表示开头

    // 2. $
    // 表示结尾

    // 下面这个表示必须以数字开头
    var reg = /^\d/
    var str1 = '1abc123'
    var str2 = 'x1abc123'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //false


    // 下面这个表示必须以数字结尾
    var reg = /\d$/
    var str1 = '1abc123'
    var str2 = 'x1abc123x'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //false


    // 表示字符串从开头到结尾只能有一个数字
    var reg = /^\d$/
    var str1 = '1abc123'
    var str2 = '1'
    console.log(reg.test(str1)); //false
    console.log(reg.test(str2)); //true


    // 表示字符串从开头到结尾之恶能由数字组成并且只能出现 0 ~ 1 次
    var reg = /^\d?$/ //字符串收尾之间(字符串本身)有且仅有0或1个数字
    var str1 = '12'
    var str2 = '1'
    var str3 = ''
    console.log(reg.test(str1)); //false
    console.log(reg.test(str2)); //true
    console.log(reg.test(str3)); //true


    /* 开头和结尾中间有且只有4个数字 */
    var reg = /^\d{4}$/ //字符串收尾之间(字符串本身)有且仅有4个数字
    var str1 = '1234'
    var str2 = '12345'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //false


    /* 在开头和结尾的中间是4个以上的连续数字 */
    var reg = /^\d{4,}$/ //字符串收尾之间(字符串本身)有且仅有4个以上的数字
    var str1 = '1234'
    var str2 = '12345 '
    var str3 = '123'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //false
    console.log(reg.test(str3)); //false



    /* 在开头和结尾的中间是4-6个连续数字 */
    var reg = /^\d{4,6}$/ //字符串收尾之间(字符串本身)有且仅有4-6个数字
    var str1 = '1234'
    var str2 = '12345'
    var str3 = '123456'
    var str4 = '123'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //true
    console.log(reg.test(str3)); //true
    console.log(reg.test(str4)); //false
  </script>

六、正则表达式_特殊符号

  <script>
    // 1. \ 转义的意思 \\代表的是“\”

    // 2. | 或的意思

    // 3. ()
    //   表示把一堆东西当成一个整体

    /* 【1个以上的单词字符】.sina.com */
    var reg = /^\w+@(126|sina|qq|foxmail)\.(com|net)$/
    var str1 = 'asd@126.net'
    var str2 = '_asd123456@sina.com'
    var str3 = ' asd123456@sina.com'
    var str4 = 'asd123456@sinaaaa.com'
    var str5 = 'asd123456@sina&com'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //true
    console.log(reg.test(str3)); //false
    console.log(reg.test(str4)); //false
    console.log(reg.test(str5)); //false

    // 4. []
    // 写在括号内部的东西人选一个就行
    // 一个 [] 内部表示一个字符
    // 下面这个正则表示 从开头到结尾 只能由一个字符出现
    // a b c d 中过的任意一个都可以
    var reg = /^[abcd]$/
    var str1 = 'aaa'
    var str2 = 'a'
    console.log(reg.test(str1)); //false
    console.log(reg.test(str2)); //true


    // 5. -
    // 到 至
    var reg = /^[a-zA-Z0-9]$/
    var str1 = 'D'
    var str2 = 'Dd'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //false

    // 6. [^]
    // 非的意思
    // 表示字符串只能有一位组成
    // 并且这一位必须是 非 a~z
    var reg = /^[^a-z]$/
    var str1 = '你'
    var str2 = '你妹'
    var str3 = 'a'
    console.log(reg.test(str1)); //true
    console.log(reg.test(str2)); //false
    console.log(reg.test(str3)); //false

  </script>

七、正则表达式_执行匹配

  <script>
    // 1. test()
    // 检测字符串是否符合要求

    // 2. exec() 执行(匹配(子串)检索(子串位置)二合一)
    var reg = /\d{3}/g
    var str = `abcd110sdfsdf120asdfsafd119`

    console.log(reg.exec(str));
    //1. 
    //['110', index: 4, input: 'abcd110sdfsdf120asdfsafd119', groups: undefined]
    // 324  第一个符合条件的子串
    // 4    第一个子串出现的位置
    // input  被检测的字符串

    console.log(reg.exec(str));
    //2.
    // ["120", index: 13, input: "abcd110sdfsdf120asdfsafd119", groups: undefined]
    
    console.log(reg.exec(str));
    //3.
    // ["119", index: 24, input: "abcd110sdfsdf120asdfsafd119", groups: undefined]
    
    console.log(reg.exec(str));
    //4.
    // null

    console.log(reg.exec(str));
    //5.
    //['110', index: 4, input: 'abcd110sdfsdf120asdfsafd119', groups: undefined]

    // 第一次执行循环匹配后先打印游标位置
    console.log("循环匹配后",reg.lastIndex); //7

    // 手动调节游标起始位置
    // reg.lastIndex = 7
    
    // 循环执行(寻找子串及其出现位置) 并输出全部匹配的结果
    var newStr = "svczvcz123hjcvsjab456ushdjkskahdah789"
    function getSuited(str){
      var arr = []
      while(arr != null){
        arr = reg.exec(str)
        console.log(arr);
      }
    }
    getSuited(newStr)
    // ['123', index: 7, input: 'svczvcz123hjcvsjab456ushdjkskahdah789', groups: undefined]
    // ['456', index: 18, input: 'svczvcz123hjcvsjab456ushdjkskahdah789', groups: undefined]
    // ['789', index: 34, input: 'svczvcz123hjcvsjab456ushdjkskahdah789', groups: undefined]
    // null

    // 未开始执行时游标为0
    var newStr2 = "svczvcz123hjcvsjab456ushdjkskahdah789"
    function getSuited1(str){
      var arr = []
      reg.lastIndex = 10
      while(arr != null){
        arr = reg.exec(str)
        console.log(arr);
      }
    }
    getSuited1(newStr2)
    //['456', index: 18, input: 'svczvcz123hjcvsjab456ushdjkskahdah789', groups: undefined]
    //['789', index: 34, input: 'svczvcz123hjcvsjab456ushdjkskahdah789', groups: undefined]
    //null
  </script>

八、正则表达式_标识符

  <script>
    // 标识符是写在正则外面的东西
    // 1. g
    // 全局搜索
    // 写了 g 以后
    // 第一次搜索是从字符串索引0开始
    // 第二次搜索是从上次结束的位置开始
    // 第三次搜索是从第二次结束的位置开始
    // 直到找不到内容了 返回 null
    // 再下一次的时候又从 索引 0 开始搜索


    /* g 全局匹配 */
    // 此处的正则如果没有全局匹配标识符g 则永远只会检索到第一个子串
    // reg.lastIndex游标当前的实时位置 在【全局模式下】游标会实时地移动 常规模式下执行一次匹配后游标归零
    var reg = /\d{3}/g
    var str = 'abcd120sdfsdf110asd119fs'
    console.log(reg.exec(str),reg.lastIndex);//[120  ...]7
    console.log(reg.exec(str),reg.lastIndex);//[110 ...] 16
    console.log(reg.exec(str),reg.lastIndex);//[119 ...] 22
    console.log(reg.exec(str),reg.lastIndex);//null 0

    // 2. i
    // 忽略大小写 ignore
    // 表示再查找的时候忽略大小写问题
    var reg1 = /^[a-z]$/
    var reg2 = /^[a-z]$/i
    var str = 'Y'
    console.log(reg1.test(str)); //false
    console.log(reg2.test(str)); //true



    /* m多行模式 每行都有收尾边界符^$
    multiple多的
    */
    var reg1 = /^[a-z]$/
    var reg2 = /^[a-z]$/gm
    var str = 'Y\ne\ns'
    var str2 = 'Y\nE\nS'
    console.log(reg1.test(str)); //false
    console.log(reg2.test(str)); //true
    console.log(reg2.test(str2)); //false

    /* y粘性模式 sticky粘性的 仅从正则表达式的lastIndex 属性表示的索引处搜索*/
    var reg = /^[a-z]$/gm
    var str = 'y\ne\ns'
    console.log(reg.lastIndex);//0
    console.log(reg.exec(str),reg.lastIndex);//y 1
    console.log(reg.exec(str),reg.lastIndex);//e 3
    console.log(reg.exec(str),reg.lastIndex);//s 5
    console.log(reg.exec(str),reg.lastIndex);//null 0

    var reg = /^[a-z]$/gmy
    var str = 'Y\ne\ns'
    reg.lastIndex = 2
    console.log(reg.lastIndex);//2
    // // /* 只会从lastindex=2的地方开始找 游标不会自己动(除非exec结果是null时归零) */
    console.log(reg.exec(str), reg.lastIndex);//e 3
    console.log(reg.lastIndex); //3
    console.log(reg.exec(str), reg.lastIndex);//null 0

    // /* null触发游标归零后 只会从0出开始找 */
    reg.lastIndex = 2
    console.log(reg.exec(str), reg.lastIndex); //['e', index: 2, input: 'Y\ne\ns', groups: undefined] 3
    console.log(reg.exec(str), reg.lastIndex); //null 0

    // // /* null触发游标归零后 只会从0出开始找 */
    console.log(reg.exec(str), reg.lastIndex); //null 0
    console.log(reg.exec(str), reg.lastIndex); //null 0

  </script>

九、正则表达式_贪婪模式与非贪婪模式

    <script>
        // 正则描述:中文若干+数字若干
        // var reg = /(([\u4e00-\u9fa5]*)(\d*))/
        // var str = "你妹123"
        // console.log( reg.exec(str) );

        function testRegGreedy() {
            // 贪婪模式(.尽量多地匹配)
            var reg1 = /(.*)(\d+)/
            var str = "你妹1234567890"
            console.log(reg1.exec(str));
            console.log(reg1.exec(str)[1]);//贪婪=尽量多吃 .*=你妹123456789 尽量少地留给后人\d+=0
            console.log("\n");

            // 非贪婪模式(.尽量少地匹配)
            var reg2 = /(.*?)(\d+)/   
            console.log(reg2.exec(str));       
            // console.log(reg2.exec(str)[1]);//非贪婪=尽量少吃 .*=你妹 尽量多地留给后人\d+=1234567890
        }
        testRegGreedy()
    </script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值