\/=...">
美文网首页Weex开发技巧weex社区让前端飞
如何使用正则表达式的捕获组与非捕获组?

如何使用正则表达式的捕获组与非捕获组?

作者: cpu_driver | 来源:发表于2017-03-31 14:25 被阅读1259次

    网上有很多类似的文章,我为什么还要写呢?是因为我在阅读Vue2.0的代码中发现了
    /^\s*([^\s"'<>\/=]+)(?:\s*((?:=))\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/ 用别人写的文章去套用的话解释不清,因此我特把此次的正则表达式的学习过程记录下来,以方便后来者能够很快的找到解决问题的答案 。


    1. 基本定义

    什么是捕获组?

    捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。当然,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部。一般一个小括号括起来就是一个捕获组。捕获组可以进行嵌套。以深度优先进行编号,在js中编号从1开始。

    例如:

    var reg=/(2(3)4)(5(6)7)/;
    console.log(
        "234567".match(reg)
    )
    

    我们可以看到上图中打印的数组,编号如下图:


    非捕获组是什么呢?

    我的理解是参与匹配却不进行分组编号的捕获组,其形式为(?:exp)组成,还有其他的形式,在此不再描述。

    例如:

    var reg=/1(?:2)/;
    console.log(
        "12".match(reg)
    )
    

    由此我们发现非捕获数组进行匹配,但不进行捕获。

    2.特殊用法

    A. 形如(?:())

    非捕获数组不参与编号分配但参与匹配
    非捕获数组不参与编号分配但参与匹配
    非捕获数组不参与编号分配但参与匹配
    其分组如下:

    也就是说exp中按照正常的分组逻辑进行分组

    B. 形如(?:()|())

    严格说这样写是解决选择缓存问题的写法(直接用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。)
    其编号为:

    C.形如 ((?:exp))

    非捕获数组不参与编号分配但参与匹配
    这种写法我认为等价于(exp)
    其分组情况为


    因此文章开头提到的表达式:


    生成这张图的地址为:链接

    相关文章

      网友评论

      • 夏目祐太:能不能讲讲断言,断言的内容不太理解
        夏目祐太: @cpu_driver 就js里面的, 之前看正则蝙蝠书的时候不太理解。
        cpu_driver: @关于郑州想的全是你 vue2.0中的?

      本文标题:如何使用正则表达式的捕获组与非捕获组?

      本文链接:https://www.haomeiwen.com/subject/rsfvottx.html