正则表达式
命名捕获组(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)); }