分组
对模式进行分组,实现分组捕获与非捕获匹配
分组字符集
字符
含义
(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
Was this helpful?