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

    技术2022-07-10  122

     第一段代码:

    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)

     

    Processed: 0.010, SQL: 9