最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】Java的正则表达式java.util.regex中的命名的组(named group)

Java regex crifan 6926浏览 0评论

【问题】

在折腾:

【已解决】Java中的正则表达式(java.util.regex)的替换

的过程中,需要用到命名的组,另外还用到替换中的引用命名的组。

想要搞懂如何使用。

【解决过程】

1. 最开始是参考,官网手册:

java.util.regex.Pattern

中,并没有看到,如何使用命名的组。

2.参考:

Regex Named Groups in Java

得知,之前老版本的Java是不支持named group的

最新的Java 7,支持named group了。

3.后来才注意到上述:

java.util.regex.Pattern

中的地址是Java 6的:

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

把其手动换成 Java 7的:

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

其实就可以看到官网的解释了:

(?<name>X)
X, as a named-capturing group

但是,官网中的解释,竟然没有其他相关的语法。

比如,在正则的替换中,如何引用命名的组之类的。

所以说,还是做的很烂。

 

【总结】

1. 看来Java做的还是,够烂啊。

这么显而易见的,正则表达式的基本功能之一,竟然都不支持。

也太假了,都弄到了Java 7,才支持,太挫了。

2.参考Regex Named Groups in Java并修订,翻译,对于Java 7+ 中的命名的组的用法,总结如下:

  • (?<groupName>X)  定义一个名为groupName的组
  • \\k<groupName> 用于向后引用(back reference)名为groupName的组
  • ${groupName} 用于,在替换函数中,后向引用名为groupName的组
  • group(groupName) 用于获得对应的带捕获的名为groupName的组的值

此处的,相关部分的代码如下:

        String filenameStr = "aa/haha.exe";
        
        //named group only support after Java 7
        //here is my java version:
        //Java: 1.7.0_09; Java HotSpot(TM) 64-Bit Server VM 23.5-b02
        Pattern filenameP = Pattern.compile("^.+/(?<filenamePart>.+)$");
        Matcher filenameMatcher = filenameP.matcher(filenameStr);
        boolean foundFilename = filenameMatcher.matches();
                
        System.out.println(filenameMatcher);
        System.out.println(foundFilename);
        
        String onlyFilename = filenameMatcher.replaceFirst("${filenamePart}");
        System.out.println(onlyFilename);

对于的输出为:

java.util.regex.Matcher[pattern=^.+/(?<filenamePart>.+)$ region=0,11 lastmatch=aa/haha.exe]
true
haha.exe

转载请注明:在路上 » 【已解决】Java的正则表达式java.util.regex中的命名的组(named group)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 傻逼,java支持不支持关你毛事,不服别用java呀。
    sdf7年前 (2017-07-31)回复
85 queries in 0.166 seconds, using 22.09MB memory