exec和match中的g标识

来源:互联网 发布:七天网络阅卷查分登录 编辑:程序博客网 时间:2024/05/22 13:28

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); // 0console.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); // 46console.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' ]*/



原创粉丝点击