正则表达式非捕获分组与具名分组
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浏览器中已经得到支持。
以上是关于正则表达式非捕获分组与具名分组的主要内容,如果未能解决你的问题,请参考以下文章