分组的概念:用()括起来的就叫一个组
分组的作用:按组获取匹配的字符串
例子:从字符串 "我好有钱,银行存款123¥"中分别截取出123、¥
import java.util.regex.Matcher; import java.util.regex.Pattern; public class CapturingGroups { public static void main(String[] args) { //分组的概念 CapturingGroups.testRegGroup("(\\d+)([¥$])","我好有钱,银行存款123¥"); } public static void testRegGroup(String reg,String resource) { Pattern p = Pattern.compile(reg); Matcher m = p.matcher(resource); System.out.println("()表示一组:m.groupCount: " + m.groupCount()); while(m.find()) { System.out.println("group(0)==group()表示整体匹配,value=" + m.group(0)); for(int i=1; i<=m.groupCount(); i++) { System.out.print("m.group("+i+")=" + m.group(i) + ","); } System.out.println(); } } }
输出:
()表示一组:m.groupCount: 2 group(0)==group()表示整体匹配,value=123¥ m.group(1)=123,m.group(2)=¥,
非捕获组:不用于捕获数据的组,那有啥用呢?看例子
import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 正则表达式非捕获组 * 特殊构造(非捕获) (JDK API说明) * 1.(?:X) X,作为非捕获组 * 2.(?idmsux-idmsux) Nothing,但是将匹配标志i d m s u x on - off * 3.(?idmsux-idmsux:X) X,作为带有给定标志 i d m s u x on - off * 4.(?=X) X,通过零宽度的正 lookahead * 5.(?!X) X,通过零宽度的负 lookahead * 6.(?<=X) X,通过零宽度的正 lookbehind * 7.(?<!X) X,通过零宽度的负 lookbehind * 8.(?>X) X,作为独立的非捕获组 * */ public class NonCapturingGroups { public static void main(String args[]) { //1.(?:)不记录组号 NonCapturingGroups.testRegExp("(\\d+)(\\.?)(\\d+)([¥$])$","123.43$",new int[]{1,4}); NonCapturingGroups.testRegExp("(\\d+)(?:\\.?)(?:\\d+)([¥$])$",2}); //2.3 用于标志匹配,比如:(?i) 打开不区分大小写开关;(?-i) 关闭标志,恢复不区分大小写 // 正则可改写成:(?i:abc)def 或者 (?i)abc(?-i:def) // 没有(?-1)时,没有关闭,可匹配AbcDef // NonCapturingGroups.testRegExp("(?i)abc(?-i)def","Abcdef"); //4.5 !为=取反 //(?=) 在前面,输出ba,4--6. 表示以b开头,结果集中包含b // 试试(?=b)a,永远无输出 再试下(?=b)b a(?=b),观察输出,自己分析下!!!!!!!! // NonCapturingGroups.testRegExp("(?=b).{2}","aacabaaqq"); //(?=) 在后面,输出ac,2--4. 表示以2字符后面紧跟b,不捕获b // NonCapturingGroups.testRegExp(".{2}(?=b)","aacabaaqq"); // NonCapturingGroups.testRegExp(".{2}(?=b).{2}","aacabaaqq"); //6.7 // lookahead: 前面紧跟 ; lookbehind: 后面紧跟 // NonCapturingGroups.testRegExp(".{2}(?=b)","aacabaaqq"); // NonCapturingGroups.testRegExp(".{2}(?<=b)","aacabaaqq"); //获取b前紧跟2字符 // NonCapturingGroups.testRegExp(".{2}(?<=b).{2}","aacabaaqq"); // 获取b后紧跟2字符 //8.(?>) 匹配失败,跳过 // NonCapturingGroups.testRegExp("a(bc|b)c","abc"); // NonCapturingGroups.testRegExp("a(?>bc|b)c","abc"); } /** * @param regExp: 正则表达式 * @param resource: 源字符串 */ public static void testRegExp(String regExp,String resource) { Pattern p = Pattern.compile(regExp); Matcher m = p.matcher(resource); int count = 0; while(m.find()) { count ++; System.out.println(m.group()); System.out.println(m.start() + "---" + m.end()); } if(count == 0) System.out.println("not find"); } /** * @param regExp: 正则表达式 * @param resource: 源字符串 * @param groups: 输出组号 */ public static void testRegExp(String regExp,String resource,int[] groups) { Pattern p = Pattern.compile(regExp); Matcher m = p.matcher(resource); while(m.find()) { if(null == groups) groups = new int[]{0}; for(int i=0; i<groups.length; i++) { System.out.print(m.group(groups[i]) + " "); } System.out.println(); } } }
非捕获组细节比较多,对照代码输出,分析下就清楚了。占不清楚应用场景。
参考:http://blog.csdn.net/chunlin304/article/details/7238905
http://www.jb51.cc/article/p-tnmqccyo-vp.html