(2)正则组

前端之家收集整理的这篇文章主要介绍了(2)正则组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

分组的概念:用()括起来的就叫一个组

分组的作用:按组获取匹配的字符串

例子:从字符串 "我好有钱,银行存款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

猜你在找的正则表达式相关文章