1、分组就是将若干单位(可以是字符,正则表达式等等)组织在一起,成为一个独立的单元,该单位可以跟独立的字符一样,受量词的控制,分组使用()表示
2、分组分为捕获性分组和非捕获性分组,简单的说捕获性分组就是捕获分组所匹配的内容暂且存储在某个地方,以便下次使用,捕获性分组以(...)表示,有些地方将取得捕获性分组所匹配结果的过程称之为"反向引用",非捕获性分组不捕获分组所匹配的内容,当然也就得不到匹配的结果,非捕获性分组以(?:...)表示,在一些只需要分组匹配但是并不需要得到各个分组匹配的结果时,使用非捕获性分组可以提高匹配速度。
3、在JavaScript和Java中,捕获性分组所匹配的内容都是以$1,$2,$3...的格式保存的!
1、数字编号捕获组
语法:(exp)
解释:从表达式左侧开始,每出现一个左括号和它对应的右括号之间的内容为一个分组,在分组中,第0组为整个表达式,第一组开始为分组。
比如固定电话的:020-85653333
他的正则表达式为:
(0\d{2})-(\d{8})
按照左括号的顺序,这个表达式有如下分组:
分组个数是2,但是因为第0个为整个表达式本身
2. 命名编号捕获组
语法:(?<name>exp)
解释:分组的命名由表达式中的name指定
比如区号也可以这样写:
(?<quhao>\0\d{2})-(?<haoma>\d{8})
按照左括号的顺序,这个表达式有如下分组:
3. 非捕获组
语法:(?:exp)
解释:和捕获组刚好相反,它用来标识那些不需要捕获的分组,说的通俗一点,就是你可以根据需要去保存你的分组。
比如上面的正则表达式,程序不需要用到第一个分组,那就可以这样写:
1 (?:\0\d{2})-(\d{8})
4、反向引用
反向引用需要使用到分组,分组就是使用()括起来的部分为一个整体,在进行分组匹配时的原则是:由外向内,由左向右
如:\1,\2等
\1:表示的是引用第一次匹配到的()括起来的部分
\2:表示的是引用第二次匹配到的()括起来的部分
(4)例:
String regex = " ^((\d)3)\1[0-9](\d)\2{2}$";
1组:(\d) ------------------------ \1
2组:((\d)3) ------------------------ \2
3组:(\d) ------------------------ \3
这里主要是分析匹配到分组的顺序,首先匹配((\d)3)这整个部分,其次匹配((\d)3)里面的(\d),第三次匹配时最后一个\2前面的(\d)
如:如((\d)3)中的(\d)为2时,((\d)3)的值为23,此时\1为((\d)3)的值1,而\2引用((\d)3)中的(\d)的值3,第三个(\d)为5时,此时\3引用第三个(\d)的值5,所以结果可以有:23238522,23230522,
本文参考