正则表达式非捕获分组与具名分组

1, 非捕获分组

在使用正则表达式的时候,我们的表达式中可能有多个分组,而我们真正关心的只有其中的某一个分组,那么如何让我们的表达式不去捕获我们不关心的分组呢,比如我们有表达式

const regex = /(Jane|John|Alison)\s(.*?)\s(Smith|Smuth)/;

这个表达式匹配英语中的最常见的几个英文名,包括名字,中间名和姓,使用该表达式来匹配下面的名字

const result = regex.exec('Jane Isabell Smith');
console.log(result[0]); // 'Jane Isabell Smith'
console.log(result[1]); // 'Jane'
console.log(result[2]); // 'Isabell'
console.log(result[3]); // 'Smith'

可以看到所有的分组都被捕获了,如果我们不关心名字说姓,那么如何只捕获中间名分组呢,在非捕获的分组开头加上 ?: 即可,我们可以重新把上面的表格式调整为:

const regex = /(?:Jane|John|Alison)\s(.*?)\s(?:Smith|Smuth)/;

使用该表达式匹配字符串: Jane Isabell Smith

const result = regex.exec('Jane Isabell Smith');
console.log(result[0]); // 'Jane Isabell Smith'
console.log(result[1]); // 'Isabell'

可见只有中间名被捕获了。

2, 具名分组,

有时我们想给分组添加一个名字索引,如上例中给中间名分组添加 middleName 索引,使得我们可以在匹配的结果中像如下方式来获取middleName: result.middleName,

事实上es6, 已经提供具名分组功能,具名分组结果放在group属性里面,语法: (?<groupName>\d+\w*), 其中groupName为该分组名字,放在尖括号中,尖括号前面为一个问号。

如获取上例中中间名

const regexp = /(?:Jane|John|Alison)\s(?<middleName>.*?)\s(?:Smith|Smuth)/;
let result = regexp.exec("Jane Isabell Smith");
console.log(result.groups.middleName);  //Isabell

具名分组在最新版本的Chrome浏览器中已经得到支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值