正则的分组
正则分组的作用:
1.改变优先级
2.分组引用
3.分组捕获
细说下.
1.改变优先级
var reg = /^x|y$/; var regg = /^(x|y)$/; var str = "x1"; reg.test(str); // true,这里其实匹配以x开头或者以y结尾 regg.test(str); // false,这里其实匹配x或者y
2.分组引用
\2表示第二个分组,\1表示第一个分组,但是\2必须在出现在第二个分组的后面,因为只有知道第二个分组是,我才知道\2是啥
这里特别注意,\2的内容和第二个分组的内容必须一模一样
举例说明
var reg = /(\d)([a-z])\1([A-Z])\2/; // 这里有3个分组,\1可以等价于(\d)所表示的值,也就\d表示2,那么\1也就只能是2而不能是3 var str = "4a4Aa"; var str1 = "4a3Aa"; reg.test(str); // true reg.test(str); // false 这里的\1只能是4
3.分组捕获
正则捕获的时候不仅把大正则匹配的内容捕获到还能把小正则的内容捕获到
还有一个规则要记得,(?:)在分组中?:的意思是只匹配不捕获,注意的是如果用了这个,表示这个分组就不会产生引用
var reg =/(\d)(?:[a-z])([A-Z])\2/; // 这里的第二个分组用了?:,所以不产生引用,也就\2表示第三个分组([A-Z]) reg.test("1aAA"); // true reg.test("1aAa"); // false
接下来用exec
var reg =/(\d)(?:[a-z])([A-Z])\2/; reg.exec("1aAA"); // ["1aAA", "1", "A"] // 第一项表示大正则,接下来就是小正则也就是小分组的内容 "1aAA".match(reg); // ["1aAA"] // 也就是match只能匹配大正则的内容
/(\d)(?:[a-z])([A-Z](0))\2(p)/.exec("1aA0A0p"); // ["1aA0A0p", "1", "A0", "0", "p"]
// 有小括号a套小括号b的时候,会先小括号a,然后再小括号里的小括号b,小括号a里面的完结之后才到下一个分组