很多正则引擎都支持命名分组,java是在java7中才引入这个特性,语法与.Net类似(.Net允许同一表达式出现名字相同的分组,java不允许)。
命名分组很好理解,就是给分组进行命名。下面简单演示一下java中如何使用以及注意事项。
1.正则中定义名为NAME的分组
(?<NAME>X)
这里X为我们要匹配的内容,注意,在这个命名不能重复,名字也不能以数字开头!
2.反向引用NAME组所匹配到的内容
\k<NAME>
注意,反向引用是针对组所匹配到的内容,而非组的表达式。
3.替换中,引用组NAME中捕获到的字符串
${NAME}
4.获取NAME组捕获的字符串
group(String NAME)
注意:也可以使用序号对命名捕获进行引用,序号从1开始,0为正则的完整匹配结果。
下面用一个简单的正则来分别获取年月日为例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
String s = "2015-10-26" ;
Pattern p = Pattern.compile( "(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})" );
Matcher m = p.matcher(s);
if (m.find()) {
System.out.println( "year: " + m.group( "year" )); //年
System.out.println( "month: " + m.group( "month" )); //月
System.out.println( "day: " + m.group( "day" )); //日
System.out.println( "year: " + m.group( 1 )); //第一组
System.out.println( "month: " + m.group( 2 )); //第二组
System.out.println( "day: " + m.group( 3 )); //第三组
}
System.out.println(s.replaceAll( "(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})" , "${day}-${month}-${year}" )); //将 年-月-日 形式的日期改为 日-月-年 形式
|
输出结果
1
2
3
4
5
6
7
|
year: 2015
month: 10
day: 26
year: 2015
month: 10
day: 26
26 - 10 - 2015
|
以上就是本文的全部内容,希望对大家的学习有所帮助。