JavaScript的正则表达式分组模式(捕获组与非捕获组)

JavaScript的正则表达式分组模式(捕获组与非捕获组)

 

目录

JavaScript的正则表达式分组模式(捕获组与非捕获组)

捕获组

捕获组的概念

捕获组的分组规则:

非捕获组


捕获组

捕获组的概念

“捕获组”是正则表达式中的概念。

在正则表达式中,使用“()”进行分组,一对圆括号括起来的表达式就是一个分组。

var rel=/([0-9])([0-9])([0-9])/;
var text="239";
var matches=text.match(rel);
console.log(matches);
//["239","2","3","9"]

上面就是一个捕获性分组的正则表达式

捕获性分组工作模式()会把每个分组里匹配的值保存起来,方便接下来的操作

var rel=/([a-z]+)\s([a-z]+)/;
var text="alen turing";
var matches=text.match(rel);
console.log(matches);
//["alen turing", "alen", "turing"]

捕获组的使用例子

例一:倒置字符串

现在我想得到“turing alen”,我有三个方法可以得到它

方法一:通过exec函数

var rel=/([a-z]+)\s([a-z]+)/;
var text="alen turing";
var arr=rel.exec(text);//exec返回一个数组,包含匹配到字符串以及分组(子串)里的值
console.log(arr);	//["alen turing","alen","turing"]
console.log(arr[0]);	//"alen turing"
console.log(arr[1]);	//"alen"
console.log(arr[2]);	//"turing"

var arr_2=arr[2]+" "+arr[1];
console.log(arr_2);		//"turing alen"

方法二:通过属性$ 1-9

var rel=/([a-z]+)\s([a-z]+)/;
var text="alen turing";
//这种方式的话,正则表达式必须至少运行一次,我们使用test()
rel.test(text);

console.log(RegExp.$1);	//"alen"
console.log(RegExp.$2);	//"turing"

var arr_2=RegExp.$2+' '+RegExp.$1;
console.log(arr_2);		//"turing alen"

方法三:通过替换()

var rel=/([a-z]+)\s([a-z]+)/;
var text="alen turing";

var arr_2=text.replace(rel,"$1 $2");
console.log(arr_2);		//"turing alen"

这三个方式使用结果没有什么区别,但是明显看出使用替换()会使代码更简洁(个人最推荐这种)

例二 :反向引用

组捕获可以反向引用(在表达式中直接使用某个分组的内容)

var rel=/([0-9])\1\1/;	//要一个aaa式的数字
var text="333";
var matches=text.match(rel);
console.log(matches);
//["333", "3"]

使用'\ num'(num是编号)这个方法就可以实现在表达式中引用捕获组的内容

捕获组的分组规则:

从左向右,分组以的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。

var rel=/(\d(\d)\d)\d/;
var text="2589";
var matches=text.match(rel);
console.log(matches);
//["2589", "258", "5"]

这里可以看出比赛[0]:2589的比赛[1]:258的比赛[2]:5

非捕获组

字符描述 
(?:模式)匹配图案,但不捕获匹配结果。'industr(?:y | ies)匹配'行业'或'行业'。
(?=图案)零宽度正向预查,不捕获匹配结果。'Windows(?= 95 | 98 | NT | 2000)'匹配“Windows2000”中的“Windows”不匹配“Windows3.1”中的“Windows”。
(?!模式)零宽度负向预查,不捕获匹配结果。'Windows(?!95 | 98 | NT | 2000)'匹配“Windows3.1”中的“Windows”不匹配“Windows2000”中的“Windows”。
(?<=图案)零宽度正向回查,不捕获匹配结果。(JS不支持)'2000(?<= Office | Word | Excel)'匹配“Office2000”中的“2000”不匹配“Windows2000”中的“2000”。
(?<!模式)零宽度负向回查,不捕获匹配结果。(JS不支持)'2000(?<!Office | Word | Excel)'匹配“Windows2000”中的“2000”不匹配“Office2000”中的“2000”。

非捕获组只匹配结果,不能在表达式和程序中做进一步处理。

使用非捕获组的好处主要是在复杂的正则表达式中,有一些情况下不得不使用分组,但我们又不关注匹配到的内容,这个时候使用非捕获组就可以节省许多内存空间,提高效率(非捕获组只参与匹配,但不会把匹配到的内容捕获到组里,不参与编号,不在内存保存)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值