Jade Dungeon

正则表达式

命名捕获组(named capture)

JDK6之前的正则表达式不支持命名捕获组功能, 只能通过捕获组的索引来访问捕获组。JDK7的新功能,支持命名分组:

  • 正则表达式中(?<NAME> xxxxxxxxx)给分组起名为NAME。注意,在这个命名不能重复,名字也不能以数字开头!
  • 正则表达式中\k<NAME>用来反向引用之前分组名NAME
  • Java的Matcher类在替换功能中使用${NAME}对应要替换的组名。
  • Java的Matcher类的group(String NAME)方法可以使用分组名。
public static void indexedCaptureTest(){//jdk6之前的使用方式
	String names = "fred or barney";
	Matcher m = Pattern.compile("(\\w+) or (\\w+)").matcher(names);
	if(m.find()){
		System.out.println(m.group(1)+","+m.group(2));
	}
}

public static void namedCaptureTest(){//jdk7可以给捕获组命名
	String names = "fred or barney";
	Matcher m = Pattern.compile("(?<name1>\\w+) or (?<name2>\\w+)").matcher(names);
	if(m.find()){
		System.out.println(m.group("name1")+","+m.group("name2"));
	}
}

反向引用的例子,把字符"aabbbccdddef"串拆成[aa, bbb, cc, ddd, e, f] 这样的数组:

public static void indexedCaptureReplace(){
	String input = "aabbbccdddef";
	String regex = "((.)+?)(?!\\2)";
	String temp = input.replaceAll(regex, "$1,");
	String[] arr = temp.split(",");
	System.out.println(java.util.Arrays.toString(arr));
}

public static void namedCaptureReplace(){
	String input = "aabbbccdddef";
	String regex = "(?<name2>(?<name1>.)+?)(?!\\k<name1>)";
	String temp = input.replaceAll(regex, "${name2},");
	String[] arr = temp.split(",");
	System.out.println(java.util.Arrays.toString(arr));
}