match方法原理实现(JS)

1. match方法原理实现(JS)

	(function () {
      function myMatch (reg) {
      	// 如果正则对象未设置全局查找 g; 则始终返回第一次捕获到的信息
      	// reg.global 判断正则对象reg是否设置了全局查找
        if (!reg.global) return reg.exec(this) 
        // 定义ary收集正则每次捕获到的信息
        let ary = []
        // res 存储正则每次捕获到的信息
        let res = reg.exec(this)
        // 正则捕获完最后一个之后再捕获, 则结果为 null, 结束捕获循环
        while (res) {
          // 收集每次捕获到的信息
          ary.push(res[0])
          // 收集捕获到的信息后, 继续向后捕获, 此时的reg.lastIndex的值已经发生改变
          res = reg.exec(this)
        }
        // 如果没有收集到任何信息则返回null\
        //未设置全局查找g, 永远返回第一次捕获到的信息
        //设置全局查找 g, 则返回所有符合该正则的信息数组
        return ary.length === 0 ? null : ary
      }
      // 将自己封装的myMatch()方法扩展到字符串的原型对象上
      String.prototype.myMatch = myMatch
    })();
    // 测试验证
    let reg = /\d+/g;
    let str1 = '等级safdsafa'
    console.log(str1.myMatch(reg)) // => null

	let reg2 = /\d+/
    let str2 = '666dhgfhd88djksgfhsd99dsjkfhkds66'
    console.log(str2.myMatch(reg)) 
    // => ['666', index: 0, input: '666dhgfhd88djksgfhsd99dsjkfhkds66', groups: undefined]

	let reg3 = /\d+/g;
    let str3 = '666dhgfhd88djksgfhsd99dsjkfhkds66'
    console.log(str1.myMatch(reg3))
    // => ['666', '88', '99', '66']

2. 向正则对象的原型对象上扩展match()方法

	let str = '666dhgfhd88djksgfhsd99dsjkfhkds66';
	(function () {
      function execMatch (str) {
        // => str: 要匹配的字符串
        // => this: RegExp的实例(当前操作的正则)
        // => 进来之后的第一件事, 是验证当前正则是否设置了g; 
        // 不设置则不能再进行循环捕获了, 否则会导致死循环
        if (!this.global) return this.exec(str)
        // => ary 存储最后所有捕获的信息; res存储每一次捕获的内容
        let ary = []
        let res = this.exec(str)
        while (res) {
          // 把每一次捕获的内容res[0]存放到数组当中
          ary.push(res[0])
          // 只要捕获的内容不为null, 则继续捕获下去
          res = this.exec(str)
        }
        return ary.length === 0 ? null : ary
      }
      RegExp.prototype.execMatch = execMatch
    })();
    let reg = /\d+/g
    console.log(reg.execMatch(str))
    // => ['666', '88', '99', '66']
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值