捕获组
用小括号包裹的部分叫做捕获组,捕获组会出现在匹配结果中
var reg = /(\d[a-z])([a-z]+)/g;
var s = "2afsdf-5fdgdfg-9asddf";
while (result = reg.exec(s)) {
console.log(result);
}
// [
// '2afsdf', // 大正则的匹配结果
// '2a', // 第一个捕获组(第一个括号)
// 'fsdf', // 第二个捕获组(第二个括号)
// index: 0,
// input: '2afsdf-5fdgdfg-9asddf',
// groups: undefined
// ]
// [
// '5fdgdfg', // 大正则的匹配结果
// '5f', // 第一个捕获组(第一个括号)
// 'dgdfg', // 第二个捕获组(第二个括号)
// index: 7,
// input: '2afsdf-5fdgdfg-9asddf',
// groups: undefined
// ]
// [
// '9asddf', // 大正则的匹配结果
// '9a', // 第一个捕获组(第一个括号)
// 'sddf', // 第二个捕获组(第二个括号)
// index: 15,
// input: '2afsdf-5fdgdfg-9asddf',
// groups: undefined
// ]
具名捕获组
捕获组可以命名,叫做具名捕获组
(?<命名>pattern)
,最后都放入 结果的 groups 中
// 得到每个日期的 年、月、日
var s = "2015-5-1, 2019-6-19, 2000-04-28";
var reg = /(?<year>\d{4})-(?<month>\d{1,2})-(?<day>\d{1,2})/g;
while (result = reg.exec(s)) {
console.log(result.groups);
}
// { year: '2015', month: '5', day: '1' }
// { year: '2019', month: '6', day: '19' }
// { year: '2000', month: '04', day: '28' }
非捕获组
非捕获组
(?:pattern)
只匹配,不捕获,把 () 当成一个整体来匹配
// 匹配年月日,只捕获 日
var s = "2015-5-1, 2019-6-19, 2000-04-28";
var reg = /(?:\d{4})-(?:\d{1,2})-(\d{1,2})/g;
while (result = reg.exec(s)) {
console.log(result);
}
// [
// '2015-5-1',
// '1', // 只捕获 日
// index: 0,
// input: '2015-5-1, 2019-6-19, 2000-04-28',
// groups: undefined
// ]
// [
// '2019-6-19',
// '19', // 只捕获 日
// index: 10,
// input: '2015-5-1, 2019-6-19, 2000-04-28',
// groups: undefined
// ]
// [
// '2000-04-28',
// '28', // 只捕获 日
// index: 21,
// input: '2015-5-1, 2019-6-19, 2000-04-28',
// groups: undefined
// ]
反向引用
在正则表达式中,利用 \捕获组编号 反向引用之前的 捕获组
eg: 捕获和 分组 1 重复 { 1, } 次
// 找出该字符串中连续的字符
var s = "aaaaaaaabbbbbbbbbccccccdefgggggggg";
var reg = /(\w)\1+/g;
while (result = reg.exec(s)) {
console.log(result);
}
// [
// 'aaaaaaaa',
// 'a', // 捕获结果
// index: 0,
// input: 'aaaaaaaabbbbbbbbbccccccdefgggggggg',
// groups: undefined
// ]
// [
// 'bbbbbbbbb',
// 'b', // 捕获结果
// index: 8,
// input: 'aaaaaaaabbbbbbbbbccccccdefgggggggg',
// groups: undefined
// ]
// [
// 'cccccc',
// 'c', // 捕获结果
// index: 17,
// input: 'aaaaaaaabbbbbbbbbccccccdefgggggggg',
// groups: undefined
// ]
// [
// 'gggggggg',
// 'g', // 捕获结果
// index: 26,
// input: 'aaaaaaaabbbbbbbbbccccccdefgggggggg',
// groups: undefined
// ]
正向断言(预查)
(?=pattern)
检查某个字符后面的字符是否满足某个规则,该规则不成为匹配结果,并且不称为捕获组
// 获取字符后面紧跟着数字的字符,qwe1 => e
var s = "sdfsdf3434343sdfsa545454dfsdfsfsd6754";
var reg = /[a-zA-Z](?=\d+)/g;
while (result = reg.exec(s)) {
console.log(result);
}
// [
// 'f',
// index: 5,
// input: 'sdfsdf3434343sdfsa545454dfsdfsfsd6754',
// groups: undefined
// ]
// [
// 'a',
// index: 17,
// input: 'sdfsdf3434343sdfsa545454dfsdfsfsd6754',
// groups: undefined
// ]
// [
// 'd',
// index: 32,
// input: 'sdfsdf3434343sdfsa545454dfsdfsfsd6754',
// groups: undefined
// ]
负向断言(预查)
(?!pattern)
检查某个字符后面的字符是否不满足某个规则,该规则不成为匹配结果,并且不称为捕获组
// 获取字符后面没有紧跟着数字的字符,qwe1 => q、w
var s = "afg43223444wr423424243";
var reg = /[a-zA-Z](?!\d+)/g;
while (result = reg.exec(s)) {
console.log(result);
}
// [ 'a', index: 0, input: 'afg43223444wr423424243', groups: undefined ]
// [ 'f', index: 1, input: 'afg43223444wr423424243', groups: undefined ]
// [ 'w', index: 11, input: 'afg43223444wr423424243', groups: undefined ]
正则表达式👉 JavaScript 中的应用
上一篇