源代码下载地址:http://download.csdn.net/detail/gnail_oug/9504094
示例功能:
1、匹配转义空格
2、判断IP地址是否合法
/** * 子表达式 * 子表达式是一个更大的表达式的一部分,子表达式必须用小括号()括起来,要当成一个独立元素来使用 * @date 2016-04-20 15:53:40 * @author sgl */ public static void subexpression(){ //注意里面的空格,假如要匹配两个以上的空格 String str="helloworld,hellojava"; //不使用子表达式,匹配不到值,因为{2,}匹配类似于;;;;;;的字符串,而不是 //{2,}只对前面的;分号有效 Pattern p=Pattern.compile("{2,}"); Matcher m=p.matcher(str); while(m.find()){ System.out.println(m.group()+" 位置:["+m.start()+","+m.end()+"]"); } //使用子表达式,将作为一个整体 p=Pattern.compile("(){2,}"); m=p.matcher(str); while(m.find()){ System.out.println(m.group()+" 位置:["+m.start()+","+m.end()+"]"); } //匹配ip地址(这里我不考虑大于255的情况,只要是1-3个数字都匹配) str="121.22.125.32,1.212.5.132"; System.out.println("==========匹配IP地址=========="); //普通方式匹配 System.out.println("----------普通方式----------"); p=Pattern.compile("\\d{1,3}\\.\\d{1,3}"); m=p.matcher(str); while(m.find()){ System.out.println(m.group()+" 位置:["+m.start()+","+m.end()+"]"); } //子表达式方式匹配 System.out.println("----------子表达式方式----------"); //由于上面的正则表达式中\\d{1,3}\\.重复了3次,所以可以用子表达式简化,匹配结果与上面相同 p=Pattern.compile("(\\d{1,3}\\.){3}\\d{1,"+m.end()+"]"); } //上面匹配空格和匹配IP的两个例子,都使用了子表达式,子表达式其中一个用途就是把多个元字符或字符用小括号 //括起来,作为一个整体(可以当成一个字符理解),方便使用* + {n,m}等规则 //子表达式也可以嵌套使用,下面还是通过匹配IP(不匹配大于255的IP)的例子来说明 //合法IP地址的规则: //1、任何一个1位或2为的数字,即0-99 //2、任何一个以1开头的3位数字,即100-199 //3、任何一个以2开头并且第2位数字在0-4之间的3位数字,即200-249 //4、任何一个以25开头并且第3位数字在0-5之间的3位数字,即250-255 System.out.println("----------匹配合法的IP地址----------"); str="121.22.125.32,10.212.5.132,260.33.22.44,23.45.600.4"; //这里IP两边增加了边界匹配,如果不加类似于260.33.22.44可以匹配到60.33.22.44 p=Pattern.compile("\\b((\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}(\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])\\b"); m=p.matcher(str); while(m.find()){ System.out.println(m.group()+" 位置:["+m.start()+","+m.end()+"]"); } }
运行结果:
位置:[5,17] 位置:[28,46] ==========匹配IP地址========== ----------普通方式---------- 121.22.125.32 位置:[0,13] 1.212.5.132 位置:[14,25] ----------子表达式方式---------- 121.22.125.32 位置:[0,25] ----------匹配合法的IP地址---------- 121.22.125.32 位置:[0,13] 10.212.5.132 位置:[14,26]