正则表达式的exec()方法需要需要传入一个字符串作为他的参数,执行完这个方法后,会返回一个数组,数组的第一个元素是匹配到的字符,第二个元素是第一个子表达式匹配到的字符(如果有的话),第三个元素是第二个子表达式匹配到的字符(如果有的话),依次类推···
举例:
var reg1 = /\d(\w)(\w)\d/
var ts = '@1av43rt64fu8'
var ret = reg1.exec(ts) // 返回的结果数组为:["1av4","a","v"]
因为reg1的匹配模式是非全局的,所以这个方法无论执行多少次都返回同样的结果数组。
需要说明的是,这个方法除了返回一个结果数组外,这个结果还有两个隐藏的属性:index和input;
index表示匹配到的字符中的首字符在元字符串中的位置,input表示元字符串;
接着上面的代码写
var index = ret.index // 返回1,因为匹配到的字符“1av4”中的首字符“1”在元字符串“@1av43rt64fu8”中的位置为1.
var input = ret.input //返回元字符串:‘@1av43rt64fu8’
上面例子中写到的正则表达式的匹配模式是非全局的,下面写一下
全局匹配模式的正则表达式的exec()方法:
var reg2 = /\d(\w)(\w)\d/g
var ts = '@1av43rt64fu8'
var ret1 = reg2.exec(ts) // 返回的结果数组为:["1av4","a","v"]
ret1.index // 1
然后我们再次对ts执行exec()方法
ret2 = reg2.exec(ts) //返回的结果数组为:["3rt6","r","t"]
ret2.index // 5
由于在全局匹配模式下,正则表达式会接着上次匹配的结果继续匹配新的字符串
所以这种情况下,正则表达式本身又有了一个新的属性:lastIndex,它指向这一次匹配到的字符串的末尾字符的下一个字符,如果我们在第一次执行exec方法的时候,再加上一行代码:
reg2.lastIndex; // 返回结果为 5,因为匹配到的结果“1av4”的末尾字符“4”的下一个字符是“3”,他的位置是5
如果我们在第二次执行exec方法的时候,再加上一行代码:
reg2.lastIndex; // 返回结果为 9,因为匹配到的结果"3rt6"的末尾字符“6”的下一个字符是“4”,他的位置是9
以上就是正则表达式的exec()方法的大概介绍。