RegExp.exec() 学习笔记
看到一道关于从url query部分取值的面试题,用了正则/.+\?(.+)$/.exec(url)[1];
,将 ? 后面的字符串取出。而我一直是用分割字符串来获取参数,故学习一番。记录在此,过几天忘了好复习。。。
最基础的正则知识可参考:
https://juejin.cn/post/6844904037481988103
https://www.w3school.com.cn/jsref/jsref_exec_regexp.asp
不使用分组的情况
执行以下代码:
var str = 'We can!'
var patt = /[A-Za-z]+/g // 区间匹配
console.log(patt.exec(str))
console.log(patt.exec(str))
console.log(patt.exec(str))
我们会得到:
["We", index: 0, input: "We can!", groups: undefined]
["can", index: 3, input: "We can!", groups: undefined]
null
我们可以看到,带上/g
全局匹配时,exec是有状态的,会依次返回可匹配的值,以及匹配值首字母对应下标。而不使用全局匹配时,则为无状态的,每次都返回相同的结果(即第一个匹配的字符串)。
使用分组的情况
执行以下代码:
var str = 'We can!'
var patt = /([A-Za-z])+/g // 区间匹配 + 分组
console.log(patt.exec(str))
console.log(patt.exec(str))
console.log(patt.exec(str))
我们会得到:
["We", "e", index: 0, input: "We can!", groups: undefined]
["can", "n", index: 3, input: "We can!", groups: undefined]
null
注意,返回数组中下标为1的成员,这是对应分组可匹配到的最后一个结果,这个结果看起来很奇怪,下面给一个正常点的例子。
var re = /666\s(brown).+?(jumps)/ig;
var result = re.exec('666 Brown 121212 Jumps 2333');
console.log(result)
["666 Brown 121212 Jumps", "Brown", "Jumps", index: 0, input: "666 Brown 121212 Jumps 2333", groups: undefined]
result[1]
对应的就是第一个分组(brown)
匹配的结果。
参考规范
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec