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

Posted yang_chuanlong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式非捕获分组与具名分组相关的知识,希望对你有一定的参考价值。

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浏览器中已经得到支持。

以上是关于正则表达式非捕获分组与具名分组的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式括号的作用

正则表达式括号的作用

正则表达式括号的作用

正则表达式中分组功能高级用法

正则表达式之补获性分组与非补获性分组

正则表达式 1. 分组提取/非捕获组