分组

对模式进行分组,实现分组捕获与非捕获匹配

分组字符集

字符

含义

(x)

  • 匹配 x并且捕获匹配项,称为捕获括号

  • 被匹配的子字符串可以在结果数组的元素 [1]...[n] 中找到

  • 或在被定义的 RegExp 对象的属性 $1...$9 中访问到

(?<key>expression)

  • 可以通过组名方便的访问到指定的组,而不需要去一个个的数编号

  • key:为组名

  • expression:为分组表达式

(?:x)

  • 匹配 x不会捕获匹配项,称为非捕获括号

  • 匹配项不能够从结果数组的元素 [1]...[n]

  • 或已被定义的 RegExp 对象的属性 $1...$9 再次访问到

分组模式

普通捕获组

捕获组的括号从左到右编号,正则引擎会记录每个分组匹配内容,并允许在模式或替换字符串中引用它

/([\d]{4})-([\d]{2})-([\d]{2})/.exec("2019-07-02"); // 捕获年月日
/**
匹配结果数组:["2019-07-02", "2019", "07", "02", index: 0, input: "2019-07-02", groups: undefined]
数据[0]:完整匹配字符串
数组[1]:捕获“年”
数组[2]:捕获“月”
数组[3]:捕获“日”
**/

如下图所示,捕获组的编号是按照“(”出现的顺序,从左到右,从1开始进行编号

嵌套捕获组

捕获分组括号允许嵌套,在这种情况下,捕获数据组编号也从左到右编号

/(([\d]{4})-([\d]{2})-([\d]{2})) ([\d:]+)/.exec("2019-07-02 10:45:28"); // 捕获日期,年月日,时间
/**
匹配结果数组:["2019-07-02 10:45:28", "2019-07-02", "2019", "07", "02", "10:45:28", index: 0, input: "2019-07-02 10:45:28", groups: undefined]
数据[0]:完整匹配字符串
数组[1]:捕获“日期”
数组[2]:捕获“年”
数组[3]:捕获“月”
数组[4]:捕获“日”
数组[5]:捕获“时间”
**/

如下图所示,嵌套捕获组的编号也是按照“(”出现的顺序,从左到右,从1开始进行编号

命名捕获组

通过给捕获组中的括号命名,可以方便访问到指定的组,而不需要去一个个的数编号

/(?<date>(?<y>[\d]{4})-(?<m>[\d]{2})-(?<d>[\d]{2})) (?<time>[\d:]+)/.exec("2019-07-02 10:45:28");
// 捕获分组命名:date:日期,y:年,m:月,d:日,time:时间
/**
匹配结果数组:
    [
        "2019-07-02 10:45:28", 
        "2019-07-02", 
        "2019", 
        "07", 
        "02", 
        "10:45:28", 
        index: 0, 
        input: "2019-07-02 10:45:28", 
        groups: {
            y: "2019", 
            m: "07", 
            d: "02", 
            date: "2019-07-02", 
            time: "10:45:28"
        }
    ]
数据[0]:完整匹配字符串
数组[1]:捕获“日期”
数组[2]:捕获“年”
数组[3]:捕获“月”
数组[4]:捕获“日”
数组[5]:捕获“时间”
groups.date:捕获“日期”
groups.y:捕获“年”
groups.m:捕获“月”
groups.d:捕获“日”
groups.time:捕获“时间”
**/

命名捕获组语法结构和普通分组类型,仅在分组前多了?<key>结构,其中key值为当前分组的名称

非捕获组

指括号分组中的内容无需捕获,不出现在匹配结果数组元素中;当我们需要括号来正确应用量词,但不希望使用分组结果中的内容,则可使用非捕获组

/(?:([\d]{4})-([\d]{2})-([\d]{2})) (?:[\d:]+)/.exec("2019-07-02 10:45:28");
// 捕获年月日
/**
匹配结果数组:["2019-07-02 10:45:28", "2019", "07", "02", index: 0, input: "2019-07-02 10:45:28", groups: undefined]
数据[0]:完整匹配字符串
数组[1]:捕获“年”
数组[2]:捕获“月”
数组[3]:捕获“日”
**/

使用非捕获组的表达式,匹配的文本将不会进入到匹配结果数组中,分组也就不会被编排

Last updated