javascript 正则方法 exec()

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个额外的属性:indexinput.
index表示匹配项在字符串中的位置,input表示应用正则表达式的字符串。

上面正则表达式中,括号()有2个作用:

  • 在修饰匹配次数时,括号中的表达式可以作为整体被修饰
  • 取匹配结果时,括号中的表达式匹配到的内容可以单独得到

问号?作用(懒惰模式:在可匹配与可不匹配的时候,优先不匹配):

  • 匹配表达式0次或者1次

这个例子中的模式包含2个捕获组。最内部的捕获组匹配‘or ipad’,而包含它的捕获组匹配‘or mac’ 或者 'or mac or ipad'.当把字符串传入exec()方法中后,发现了一个匹配项。因为整个字符串本身与模式匹配,所以返回的数组matchindex属性为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 修饰符的设计本意,就是让头部匹配的标志 ^ 在全局匹配中都有效。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值