exec()
是RegExp
对象的主要方法。exec()
接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组,或者在没有匹配项的情况下返回null
。
let reg = /apple (or mac (or ipad)?)?/g;
let str = 'apple or mac or ipad';
let match = reg.exec(str);
console.log(match);
/*
[ 'apple or mac or ipad',
'or mac or ipad',
'or ipad',
index: 0,
input: 'apple or mac or ipad' ]
*/
console.log(match[0]); //apple or mac or ipad
console.log(match[1]); //or mac or ipad
console.log(match[2]); //or ipad
console.log(match.index); //0
console.log(match.input); //apple or mac or ipad
console.log(match instanceof Array); //true
上面结果返回的虽然是Array
的实例,但包含2个额外的属性:index
,input
. index
表示匹配项在字符串中的位置,input
表示应用正则表达式的字符串。
上面正则表达式中,括号()
有2个作用:
- 在修饰匹配次数时,括号中的表达式可以作为整体被修饰
- 取匹配结果时,括号中的表达式匹配到的内容可以单独得到
问号?
作用(懒惰模式:在可匹配与可不匹配的时候,优先不匹配):
- 匹配表达式0次或者1次
这个例子中的模式包含2个捕获组。最内部的捕获组匹配‘or ipad’
,而包含它的捕获组匹配‘or mac’
或者 'or mac or ipad'
.当把字符串传入exec()
方法中后,发现了一个匹配项。因为整个字符串本身与模式匹配,所以返回的数组match
的index
属性为0
数组中的第一项是匹配的整个字符串,第二项包含与第一个捕获组匹配的内容,第三项包含与第二个捕获组匹配的内容。
对于exec()
方法而言,即使在模式中设置了全局标志g
,它每次也只能返回一个匹配项。在不设置全局标志情况下,在同一个字符串上多次调用exec()
方法将始终返回第一个匹配项的信息,在设置全局标志的情况下,每次调用exec()
则都会在字符串中继续查找新的匹配项。
如下:
let a = 'reactjs,angularjs,vuejs,backbonejs';
let reg = /.js/;
let match = reg.exec(a);
console.log(match);
console.log(match.index);
console.log(reg.lastIndex);
match = reg.exec(a);
console.log(match);
console.log(match.index);
console.log(reg.lastIndex);
输出结果:
[ 'tjs', index: 4, input: 'reactjs,angularjs,vuejs,backbonejs' ]
4
0
[ 'tjs', index: 4, input: 'reactjs,angularjs,vuejs,backbonejs' ]
4
0
下面是加上全局标志:
let a = 'reactjs,angularjs,vuejs,backbonejs';
let reg = /.js/g;
let match = reg.exec(a);
console.log(match);
console.log(match.index);
console.log(reg.lastIndex);
match = reg.exec(a);
console.log(match);
console.log(match.index);
console.log(reg.lastIndex);
结果如下:
[ 'tjs', index: 4, input: 'reactjs,angularjs,vuejs,backbonejs' ]
4
7
[ 'rjs', index: 14, input: 'reactjs,angularjs,vuejs,backbonejs' ]
14
17
在全局模式下,lastIndex
的值在每次调用exec()
后都会增加,而在非全局模式下保持不变.
补充于2018-08-29:
y 修饰符
以下摘自阮老师《ECMAScript 6 入门》,http://es6.ruanyifeng.com/#docs/regex#y-%E4%BF%AE%E9%A5%B0%E7%AC%A6
ES6 还为正则表达式添加了 y 修饰符,叫做“粘连”(sticky)修饰符。
y 修饰符的作用与 g 修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于, g 修饰符只要剩余位置中存在匹配就可,而 y 修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。
var s = 'aaa_aa_a';
var r1 = /a+/g;
var r2 = /a+/y;
r1.exec(s) // ["aaa"]
r2.exec(s) // ["aaa"]
r1.exec(s) // ["aa"]
r2.exec(s) // null
【注意】 y 修饰符号隐含了头部匹配的标志 ^ 。
/b/y.exec('aba')
// null
上面代码由于不能保证头部匹配,所以返回 null 。 y 修饰符的设计本意,就是让头部匹配的标志 ^ 在全局匹配中都有效。