JS RegExp实例 exec()方法
描述:
exec()
方法在目标字符串中查找匹配的子字符串,若存在匹配,则返回一个数组,否则返回null
。
/\d+/.exec('JS123'); // ['123']
/\D+/.exec('JS123'); // ['JS']
/ecmaer/.exec('JS123'); // null
语法:
RegExp.prototype.exec(strObj)
参数:
参数 | 描述 |
---|---|
strObj | 待匹配的字符串。 |
返回值:
exec()
方法返回包含匹配到子字符串的数组或null。
返回数组的成员构成
如果匹配成功,数组的第一个成员是正则表达式匹配到的字符串,第2到n个成员是子表达式(如果存在的话)匹配到的字符串。
返回数组包含了其他匹配相关信息
这些信息存储在数组对象的属性中:
index
属性:第一次匹配到的字符(串)在原始字符串中的位置索引值。input
属性:原始字符串。
例1: 子表达式的匹配
let arr = /\D+(\d+)/.exec('000aa111bb222cc333');
console.info(arr); // ["aa111", "111"]
console.info(arr.index); // 3 (表示匹配的字符串的位置索引值)
console.info(arr.input); // "000aa111bb222cc333" (表示原始字符串)
上面的例子中:返回的数组的第一个成员是表达式的第一个匹配,第二个成员是子表达式((\d+)
)匹配的字符(串)。
例2:exec()在全局匹配模式中的用法
// 声明一个全局匹配的正则表达式
let reg = /\d+/g, str = '123aaa456bbb789ccc';
console.info(reg.lastIndex); // 0
reg.exec(str); // ['123']
console.info(reg.lastIndex); // 3
reg.exec(str); // ['456']
console.info(reg.lastIndex); // 9
reg.exec(str); // ['789']
console.info(reg.lastIndex); // 15
reg.exec(str); // null
console.info(reg.lastIndex); // 0
reg.exec(str); // ['123']
console.info(reg.lastIndex); // 3
上面的例子展示了全局正则表达式的几个特点:
exec()
方法每次执行仅匹配一次就返回结果- 正则对象的
lastIndex
表示匹配的起始位置,初始值为0
- 每一次匹配成功后,lastIndex值变成匹配子字符串后一位的位置索引值,即每次匹配成功,下一次匹配将从之前匹配成功子字符串后一个位置开始。
- 当
exec()
匹配失败后,正则对象的lastIndex
重新归位为0