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']