第一段代码:
String replacement = "${segment}";
String regexp = "/red(?<segment>.*)";
String path = "/red/blue/k.do";
String newPath = path.replaceAll(regexp, replacement);
System.out.println(newPath);
其执行结果:
/blue/k.do
这段代码看起来不太好理解,实际上
String regexp = "/red(?<segment>.*)";
从正则表达式的含义上,等同于
String regexp = "/red.*";
只不过,为方便提取匹配正则表达式的字符串,定义了一个叫segment的变量名而已
(?<segment>.*)
变量名需要用?<>包裹起来,同时这个变量名和它要匹配的正则表达式一起,再用()包裹起来。这种用法就叫命名分组。
上面的代码如果先拆分成如下代码,看起来会更清楚。第二段代码:
String regexp = "/red(?<segment>.*)";
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变量做替换。因此看起来比较复杂,不是很清晰。
参考文档