当前位置:  开发笔记 > 编程语言 > 正文

Java中的正则表达式命名组

如何解决《Java中的正则表达式命名组》经验,为你挑选了3个好方法。

据我所知,该java.regex软件包不支持命名组(http://www.regular-expressions.info/named.html),所以有人能指向我的第三方库吗?

我看过jregex,但它的最后一个版本是在2002年,它在java5下对我(不可否认我只是简单地试过)不起作用.



1> VonC..:

(更新:2011年8月)

正如geofflane在他的回答中提到的,Java 7现在支持命名组.
tchrist在评论中指出支持是有限的.
详细解释了他的答案" Java Regex Helper " 的局限性

Java 7正则表达式命名组支持于20109月在Oracle的博客中发布.

在Java 7的官方发行版中,支持命名捕获组的构造是:

(?capturing text) 定义命名组"名称"

\k 反向引用命名组"名称"

${name} 在Matcher的替换字符串中引用捕获的组

Matcher.group(String name) 通过给定的"命名组"返回捕获的输入子序列.


Java 7之前的其他替代方案是:

Google命名为-regex(参见John Hardy的回答)
GáborLipták提到(2012年11月)该项目可能不活跃(有几个突出的错误),而且可以考虑使用它的GitHub fork.

jregex(见Brian Clozel的回答)


(原始答案:2009年1月,现在已经破了下两个链接)

您不能引用命名组,除非您编写自己的Regex版本...

这正是Gorbush2在这个帖子中所做的.

Regex2

(有限的实现,正如tchrist再次指出的那样,因为它只查找ASCII标识符.tchrist将限制详述为:

只能在每个相同的名称上有一个命名组(您不能总是控制它!)并且不能将它们用于正则表达式递归.

注意:您可以在Perl和PCRE正则表达式中找到真正的正则表达式递归示例,如Regexp Power,PCRE规范和带平衡括号的匹配字符串幻灯片中所述)

例:

串:

"TEST 123"

正则表达式:

"(?\\w+) (?\\d+)"

访问

matcher.group(1) ==> TEST
matcher.group("login") ==> TEST
matcher.name(1) ==> login

更换

matcher.replaceAll("aaaaa_$1_sssss_$2____") ==> aaaaa_TEST_sssss_123____
matcher.replaceAll("aaaaa_${login}_sssss_${id}____") ==> aaaaa_TEST_sssss_123____ 

(从实现中提取)

public final class Pattern
    implements java.io.Serializable
{
[...]
    /**
     * Parses a group and returns the head node of a set of nodes that process
     * the group. Sometimes a double return system is used where the tail is
     * returned in root.
     */
    private Node group0() {
        boolean capturingGroup = false;
        Node head = null;
        Node tail = null;
        int save = flags;
        root = null;
        int ch = next();
        if (ch == '?') {
            ch = skip();
            switch (ch) {

            case '<':   // (?'){
                    // valid group name
                    int len = cursor-start;
                    int[] newtemp = new int[2*(len) + 2];
                    //System.arraycopy(temp, start, newtemp, 0, len);
                    StringBuilder name = new StringBuilder();
                    for(int i = start; i< cursor; i++){
                        name.append((char)temp[i-1]);
                    }
                    // create Named group
                    head = createGroup(false);
                    ((GroupTail)root).name = name.toString();

                    capturingGroup = true;
                    tail = root;
                    head.next = expr(tail);
                    break;
                }



2> geofflane..:

对于那些迟到的人:Java 7添加了命名组.Matcher.group(String groupName)文档.



3> 小智..:

是的,但它太乱了太阳课.有一种更简单的方法:

http://code.google.com/p/named-regexp/

named-regexp是标准JDK正则表达式实现的瘦包装器,其唯一目的是以.net样式处理命名捕获组:(?...).

它可以与Java 5和6一起使用(使用泛型).

Java 7将处理命名的捕获组,因此该项目并不意味着持续.


查看这个项目的[GitHub fork](https://github.com/tony19/named-regexp),它修复了原始版本中的一些错误.它也在Maven Central托管.
@RubberMallet,特定于Android的问题现在已经[修复](https://tony19.atlassian.net/browse/REGEX-9)并且将在0.1.9中.
推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有