• RegExp对象的exec方法


    RegExp对象的exec方法和String对象的match方法用法十分相似,分两篇博客讲讲其各自的用法和它们之间的异同。

    下一篇讨论match方法的用法和两者的异同。

    定义及语法

    【定义】

    exec() 方法用于检索字符串中的正则表达式的匹配。

    【语法】

    RegExpObject.exec(string)

    【返回值】

    返回一个数组,其中存放匹配的结果,第一项为与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串,且数组还包含两个属性:index和input。其中index表示匹配项在字符串中的位置,input表示应用正则表达式的字符串。如果未找到匹配,则返回值为 null。

    RegExp对象是否为全局正则表达式(是否有全局标志g)产生的结果有所不同,因此以下我们分两种情况讲解:

    1)RegExp对象不是全局表达式;

    2)RegExp对象是全局表达式。

    RegExp对象不是全局表达式

    var str="web2.0 .net2.0";
    var pattern=/(w+)(d).(d)/;//没有全局标志g
    console.log(pattern.exec(str));

    结果如下:

    image

    第一项:web2.0,与整个模式匹配的结果,也就是与/(w+)(d).(d)/匹配的结果;

    第二项:web,与第一个匹配组匹配的结果,也就是与(w+)匹配的结果;

    第三项:2,与第二个匹配组匹配的结果,也就是与(d)匹配的结果;

    第四项:0,与第三个匹配组匹配的结果,也就是与(d)第二个(d))匹配的结果;

    属性一:index:0,匹配项在字符串中的位置,也就是数组第一项的匹配字符串的位置。

    属性二:input:"web2.0 .net2.0",也就是输入参数str。

    以上结果就是每次执行exec方法所得的结果的格式,如果有更多捕获组,结果中会按顺序列出所有的结果。

    这个时候,如果我们再执行一次exec方法:

    var str="web2.0 .net2.0";
    var pattern=/(w+)(d).(d)/;//没有全局标志g
    console.log(pattern.exec(str));
    console.log(pattern.exec(str));

    两次得到的结果会完全相同(设置了全部属性就会不一样),也就是当RegExp对象没有全局标志时,exec方法每次都只是从头开始匹配,每次都是返回第一个匹配项,net2.0尽管也满足RegExp对象,但不会被检索到。

    RegExp对象是全局表达式

    var str="web2.0 .net2.0";
    var pattern=/(w+)(d).(d)/g;//有全局标志g
    console.log(pattern.exec(str));
    console.log(pattern.exec(str));

    两次的结果如下:

    image                          image

    可以看出两次结果不同,第二次的结果是在第一次结果的基础上继续往后查找,而不是从头开始。因此,是否设置全局标志g,不会影响第一次的执行结果,但是会决定第二次及以后的结果。我们可以通过RegExp的lastIndex属性(表示开始搜索下一个匹配项的字符位置)验证一下:

    var str="web2.0 .net2.0";
    var pattern=/(w+)(d).(d)/g;//有全局标志g
    var match1= pattern.exec(str);
    console.log(pattern.lastIndex);//6
    var match2= pattern.exec(str);
    console.log(pattern.lastIndex);//14

    可以看到第一次执行exec后,RegExp的lastIndex为6;第二次执行exec后,RegExp的lastIndex为14,说明每次搜索的起点是接在上次的匹配结果之后的。

    我们可以对比一下不设置全局标志的结果:

    var str="web2.0 .net2.0";
    var pattern=/(w+)(d).(d)/;//没有全局标志g
    var match1= pattern.exec(str);
    console.log(pattern.lastIndex);//0
    var match2= pattern.exec(str);
    console.log(pattern.lastIndex);//0

    两次的lastIndex都是0,表示下一次仍然从头开始搜索。

    总结

    1)exec是RegExp对象的方法,接受参数为字符串;

    2)exec执行一次只返回包含一个匹配项信息的数组,数组格式为[与整个模式匹配的字符串,与第一个捕获组匹配的字符串,与第二个捕获组匹配的字符串,……],数组有两个属性,分别为匹配得到的字符串的位置index和输入参数字符串input;

    3)不设置全局标志g时,exec方法每次都从头开始检索,并返回第一个匹配项;设置全局标志g时,exec方法从上次检索的重点开始检索,也就是lastIndex值的位置。

  • 相关阅读:
    233
    膝为筋之府
    AES 可逆性加密算法
    DES 可逆性加密算法
    Java Swing如何让窗体居中显示
    eclipse 安装插件
    eclipse 搭建Swt 环境
    Java Set元素比较
    Greenplum数据库中系统表gp_ distribution_ policy详解
    Greenplum数据库中系统表pg_class详解
  • 原文地址:https://www.cnblogs.com/youhong/p/6850603.html
Copyright © 2020-2023  润新知