exec和match中的g标识

exec() 函数是RegExp对象的一个方法;match()是String对象的一个方法。


正则表达式中,如果没有g,exec和match方法都是返回字符串中第一个匹配的部分,如果有分组的话,分组也会返回;

如果有g,exec每执行一次都会将reg的lastIndex属性更新,下次载执行exec时,会从这个值开始搜索匹配的部分,如果有分组的话,分组也返回;

如果有g,match会将字符串中所有与正则表达式匹配的部分返回,忽视分组。


假设有一个字符串:

str='dwd bill.gates@microsoft.com someone@gmail.com';

匹配邮件的正则表达式:

let re = /([\w\.]+)\@(\w+)\.(\w+)/; 
// 匹配邮件的正则表达式,并进行了分组,@之前是一组,@到.之间分一组,.之后分一组

没有g: 

// 第一次执行re.exec(str)
console.log(re.exec(str));
console.log(re.lastIndex); // 0
// 第二次执行re.exec(str)
console.log(re.exec(str));
console.log(re.lastIndex); // 0

console.log(str.match(re));
console.log(str.match(re));

/*
exec()hmatch()返回值一样,不论执行了多少次:

[ 'bill.gates@microsoft.com',
    'bill.gates',
    'microsoft',
    'com',
    index: 4,
    input: 'dwd bill.gates@microsoft.com someone@gmail.com' ]

re.lastIndex的值两次都为0,可以认为在没有g时,没有继续向后序内容匹配的需求,所以lastIndex没有必要更改。
*/

有g:

// 第一次执行re.exec(str)
console.log(re.exec(str));
console.log(re.lastIndex); // 28
// 第二次执行re.exec(str)
console.log(re.exec(str));
console.log(re.lastIndex); // 46

console.log(str.match(re));
console.log(str.match(re));

/*

对于exec来说,有g意味着我有继续向后序内容匹配的需求,没调用一次exec就匹配一次,只是每次匹配的起点不同(由lastIndex决定);
对于match来说,有g意味着我需要得到所有与整条正则表达式(不管分组)匹配的部分

[ 'bill.gates@microsoft.com',
    'bill.gates',
    'microsoft',
    'com',
    index: 4,
    input: 'dwd bill.gates@microsoft.com someone@gmail.com' ]
28
    [ 'someone@gmail.com',
    'someone',
    'gmail',
    'com',
    index: 29,
    input: 'dwd bill.gates@microsoft.com someone@gmail.com' ]
46
    [ 'bill.gates@microsoft.com', 'someone@gmail.com' ]
    [ 'bill.gates@microsoft.com', 'someone@gmail.com' ]
*/



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值