Java:正则表达式-命名捕获

 第一段代码:

String replacement = "${segment}";
String regexp = "/red(?.*)";

String path = "/red/blue/k.do";
String newPath = path.replaceAll(regexp, replacement);

System.out.println(newPath);

其执行结果:

/blue/k.do

 这段代码看起来不太好理解,实际上

String regexp = "/red(?.*)";

从正则表达式的含义上,等同于

String regexp = "/red.*";

 只不过,为方便提取匹配正则表达式的字符串,定义了一个叫segment的变量名而已

(?.*)

变量名需要用?<>包裹起来,同时这个变量名和它要匹配的正则表达式一起,再用()包裹起来。这种用法就叫命名分组。

上面的代码如果先拆分成如下代码,看起来会更清楚。第二段代码:

String regexp = "/red(?.*)";

String path = "/red/blue/k.do";
		
Pattern pattern = Pattern.compile(regexp);
Matcher matcher = pattern.matcher(path);
matcher.find();

System.out.println(matcher.group("segment"));

它的执行结果:

/blue/k.do

 第一段代码中,不但把匹配正则表达式的字符串找出来,并赋值给segment变量,还直接使用segment变量做替换。因此看起来比较复杂,不是很清晰。

 

参考文档

Java 正则表达式的捕获组(capture group)

 

你可能感兴趣的:(Java)