正则对象的exec()方法
- 语法
regexp.exec(str) - 返回值(分两种情况)
- 正则表达式不带g(global)或y(sticky)属性时
返回一个数组,数组元素的第一项是第一个全匹配字符串,接下来依次是捕获组字符串。并且该数组带有两个额外属性:index和input。index为第一次全匹配字符串的位置,input为原字符串的值。看下面例子:var reg = /\d{1,3}([a-f]*)(M)/; var str = "s123abcM456fff"; const result = reg.exec(str); console.log(result,result.index,result.input); //输出["123abcM", "abc", "M"],1,s123abcM456fff
- 正则表达式带g(global)或y(sticky)属性时
当正则对象带有g或y属性时,表明该正则对象是有状态的,每次执行exec()方法会更新正则对象的lastIndex的值,下次执行exec()时从lastIndex处开始查找,匹配失败时重置lastIndex值为0。返回结果与上面类似,也是一个数组,第一项是全匹配字符串,接下来依次是捕获组字符串,数组带有额外index和input属性。看下面例子:var reg = /\d{1,3}([a-f]*)(M)/g; var str = "s123abcM456fffM"; const result = reg.exec(str); console.log(result,result.index,reg.lastIndex); // 输出["123abcM", "abc", "M"],1,8 const result2 = reg.exec(str); console.log(result2,result2.index,reg.lastIndex); // 输出["456fffM", "fff", "M"],8,15 const result3 = reg.exec(str); console.log(result3,reg.lastIndex); // 输出null,0 因为位置15是字符串末尾,匹配失败,重置正则对象的lastIndex属性为0
- 即使下次执行exec()方法时,查找字符串换了,即参数str变了,还是会从lastIndex处开始匹配。 - 上面两种说的都是匹配成功时的返回结果,若匹配失败,则返回null。
- 正则表达式不带g(global)或y(sticky)属性时
- 小结
上面两种的不同之处在于一个是没状态的,一个是有状态的,没状态的每次执行exec()方法都会返回相同的结果,有状态的每次执行exec()后会更新lastIndex的值,下次执行exec()从lastIndex处开始查找,返回结果可能是不一样的。
字符串的match()方法
- 语法
str.match(regexp) - 返回值(分两种情况)
- regexp不带g属性
当正则表达式不带g属性时,str.match(regexp)与regexp.exec(str)会返回一样的结果。这里只给出定论,就不做验证了。 - regexp带有g属性时
当正则表达式带有g属性时,返回的结果是一个数组,包含所有的全匹配字符串,不包含捕获组,并且此时数组没有index和input属性。看下面例子:var reg = /\d{1,3}([a-f]*)(M)/g; var str = "s123abcM456fffM"; const result = str.match(reg); console.log(result, result.index, result.input); // 输出 ["123abcM", "456fffM"] undefined undefined
- regexp不带g属性
总结
当正则表达式不带g属性时,regexp.exec(str)与str.match(regexp)返回结果相同。
当正则表达式带有g属性时,表明正则对象是有状态的,regexp.exec(str)方法每次执行会更新regexp的lastIndex值;str.match(regexp)返回一个包含所有全匹配字符串的数组,该数组没有额外的index和input属性。
exec()与match()匹配失败时都会返回null。