第一段代码:
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变量做替换。因此看起来比较复杂,不是很清晰。
参考文档
Java 正则表达式的捕获组(capture group)