正则表达式--反向引用

1.1 分组

反向引用的使用是基于分组的,所以得先理解清楚正则中分组的概念。什么是分组?个人理解的分组是正则匹配的一个或者多个字符,通常像元字符w,d,s只能匹配一个字符,或者 [ ] 范围的匹配也只是匹配一个字符。但是当需要匹配重复的组的时候,例字符串:“asd123asd123”,不使用分组的正则写法是

1 var str = "asd123asd123";
2 var reg = /[a-z]{3}[1-9]{3}/;
3 reg.test(str);   //true

这种写法不但违反计算机科学原理,程序猿看上去还觉得别扭(众所周知,重复的代码都习惯了封装),所以我所理解的分组,其实就是正则表达式中的一种 “封装” 而已。那么经过封装后,上面的写法可以改写为

1 var str = "asd123asd123";
2 var reg = /([a-z]{3}[1-9]{3})1+/; 
3 reg.test(str); //true

但是正则中的“封装“有个特点,就是引用时,引用的并非分组里面的正则表达式,而是已经匹配成功的内容,从以下代码说明这点

1 var str = "asd123dsa321";
2 var reg = /([a-z]{3}[1-9]{3})1+/; 
3 reg.test(str); // false, 1引用匹配的是已经匹配成功的asd123

分组的概念理解到这里,下面继续来学习后向引用

1.2 后向引用

其实在上面的例子中,已经使用到了正则的后向引用。先来看看后向引用的概念---------“使用小括号指定一个子表达式后,匹配这个子表达式的文本可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:以分组的左括号为标志,从左向右,第一个分组的组号为1,第二个为2,以此类推。后向引用用于重复搜索前面某个分组匹配的文本。

从概念中可以看出,其大概意思是使用正则去匹配字符串的时候,由于字符串中可能出现重复匹配的字符。那么先定好规则,当最左边的分组规则(即括号内的规则匹配成功时,记录匹配成功的字符串,给其一个1好让后面继续拿来使用),第二个给2,第三个给3......

1 var str = "asd123zxc";
2 var reg = /(asd)((1)(2)(3))(zxc)/;
3 reg.exec(str);   // ["asd123zxc", "asd", "123", "1", "2", "3", "zxc", index: 0, input: "asd123zxc"]
4 
5 //观察这里的数组可以发现, 代表要匹配的整体, 1 为第一个分组, 2为第二个分组整体((1)(2)(3)), 3 为第二个分组内的子分组(1).......

这里面的重点是要理清分组中的嵌套关系。

后向引用还有另外一个用法,就是$1,$2,$3......

1 var str = "asd123asd123";
2 var reg = /([a-z]{3}[1-9]{3})/;
3 
4 str.replace(reg,"--$1--");   //"--asd123--asd123"
原文地址:https://www.cnblogs.com/xiyangcai/p/8065117.html