版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/duola8789/article/details/82668083
关于reg.exec
和string.match
方法
exec
是RegExp对象的方法,参数才是字符串,match
是字符串执行匹配正则表达式规则的方法,参数是正则表达,返回的都是数组;
在正则表达式没有全局标志g
时,二者的返回值是相同的
- 正则表达式中没有捕获组时,返回值是只有一个成员的数组,第一项是从起始位置开始寻找的第一个匹配项,无论执行多少次都是相同的(从位置0开始)
- 正则表达式中有捕获组时,返回值是一个数组,第一项是从起始位置开始寻找的第一个匹配项,后续是匹配的捕获组,无论执行多少次都是相同的(从位置0开始)
const text = 'cat, bat';
let pattern = /.at/
pattern.exec(text)
// ["cat"]
pattern.exec(text)
// ["cat"]
text.match(pattern)
// ["cat"]
text.match(pattern)
// ["cat"]
let pattern2 = /.(at)/
pattern2.exec(text)
// ["cat", "at"]
pattern2.exec(text)
// ["cat", "at"]
在正则表达式含有全局标志g
时,二者的返回值不同
- 正则表达式中没有捕获组的时候
match
方法返回的数组成员是所有符合条件的匹配项,数组第一个成员存放第一个匹配项,数组第而个成员存放第二个匹配项…依次类推。无论执行多少次返回结果相同exec
方法永远返回值是只有一个成员的数组,第一项是第一个匹配项。但是当连续调用exec时,则每次的返回值都是在现有位置继续寻找的下一个匹配项。
let pattern3 = /.at/g
text.match(pattern3)
// ["cat", "bat"]
text.match(pattern3)
// ["cat", "bat"]
pattern3.exec(text)
// ["cat"]
pattern3.exec(text)
// ["bat"]
- 正则表达式有捕获组的时候
match
返回值与没有捕获组时相同,返回的数组由匹配项组成exec
返回值与没有g的捕获组正则表达式相同,第一项是从起始位置开始寻找的第一个匹配项,后续是匹配的捕获组,但如果执行多次返回值都是在现有基础上继续寻找的
let pattern4 = /.(at)/g
text.match(pattern4)
// ["cat", "bat"]
text.match(pattern4)
// ["cat", "bat"]
pattern4.exec(text)
// ["cat", "at"]
pattern4.exec(text)
// ["bat", "at"]
总结
总结一下:(g代表全局标志,捕代表捕获组,每种情况的用→
连接的多个数组代表执行多次的结果)
对于match
方法,是字符串的方法,返回值是数组
- 有g无捕:
[匹配1, 匹配2, ...]
→[匹配1, 匹配2, ...]
- 有g有捕:
[匹配1, 匹配2, ...]
→[匹配1, 匹配2, ...]
- 无g无捕:
[匹配1]
→[匹配1]
- 无g有捕:
[匹配1, 捕获1-1, 捕获1-2...]
→[匹配1, 捕获1-1, 捕获1-2...]
对于exec
方法,是RegExp对象的方法,返回值是数组
- 有g无捕:
[匹配1]
→[匹配2]
- 有g有捕:
[匹配1, 捕获1-1, 捕获1-2...]
→[匹配2, 捕获2-1, 捕获2-2...]
- 无g无捕:
[匹配1]
→[匹配1]
- 无g有捕:
[匹配1, 捕获1-1, 捕获1-2...]
→[匹配1, 捕获1-1, 捕获1-2...]