140 votos

Regex Grupos con Nombre en Java

Es mi entendimiento de que el java.regex paquete no tiene soporte para grupos con nombre (http://www.regular-expressions.info/named.html) así que puede que nadie me señale hacia una tercera parte de la biblioteca que hace?

He mirado en jregex pero su último lanzamiento fue en el 2002 y no trabajo para mí (es cierto que sólo he probado brevemente) en virtud de java5.

227voto

VonC Puntos 414372

(Actualización: Agosto De 2011)

Como geofflane menciona en su respuesta (upvoted), Java 7 ahora apoyo a los grupos con nombre.
tchrist señala en el comentario de que el soporte es limitado.
Él los detalles de las limitaciones en su gran respuesta "Java Regex Helper"

Java 7 regex denominado grupo de apoyo se presentó de nuevo en septiembre de 2010 en Oracle blog.

En la versión oficial de Java 7, la construye para apoyar el denominado grupo de captura son:

  • (?<name>X) para definir el nombre de un nombre de grupo"
  • \k<name> a retroreferencia un grupo con nombre "nombre"
  • ${name} con referencia al grupo capturado en el Comparador de la cadena de reemplazo
  • Matcher.group(String name) a devolver la captura de la entrada subsequence por el "nombre de grupo".

Otras alternativas para la pre-Java 7 fueron:


(Respuesta Original: Ene 2009, con los siguientes dos enlaces rotos)

Puede que no se refiera a nombre de grupo, a menos que el código de su propia versión de Regex...

Eso es precisamente lo que Gorbush2 hizo en este hilo.

Regex2

(aplicación limitada, como se señaló de nuevo por tchrist, como se ve, sólo para ASCII identificadores. tchrist detalles de la limitación como:

sólo ser capaz de tener una con el nombre del grupo por el mismo nombre (que no siempre se tiene el control!) y no siendo capaz de usarlos para en-regex la recursividad.

Nota: puede encontrar la verdadera expresión de la recursión ejemplos en Perl y PCRE, expresiones regulares, como se ha mencionado en Regexp Poder, PCRE especificaciones y la Coincidencia de Cadenas Equilibrada de los Paréntesis de la diapositiva)

Ejemplo:

Cadena:

"TEST 123"

RegExp:

"(?<login>\\w+) (?<id>\\d+)"

Acceso

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

Reemplazar

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

(extracto de la aplicación)

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 '<':   // (?<xxx)  look behind or group name
                ch = read();
                int start = cursor;
[...]
                // test forGroupName
                int startChar = ch;
                while(ASCII.isWord(ch) && ch != '>') ch=read();
                if(ch == '>'){
                    // 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;
                }

27voto

John Hardy Puntos 211

Sí, pero desordenado de hacking que el sol de las clases. Hay una manera más sencilla:

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

nombre regexp es un envoltorio para la estándar JDK expresiones regulares la aplicación, con el único propósito de la manipulación de capturas con nombre los grupos en el .estilo neto : (?...).

Puede ser utilizado con Java 5 y 6 (genéricos).

Java 7 se identificador de llamada captura de los grupos , por lo que este proyecto no es a la última.

25voto

geofflane Puntos 1845

Para la gente que viene para esta tarde: Java 7 agrega denominado grupos. Comparador.grupo(String groupName) documentación.

2voto

Brian Clozel Puntos 6473

¿Qué tipo de problema con jregex? Funcionó bien para mí en la java5 y java6.

Jregex hace bien el trabajo (aunque la última versión es de 2002), a menos que usted desea esperar a que el javaSE 7.

2voto

Ryan Smith Puntos 106

Para aquellos que ejecutan pre-java7, denominado grupos son apoyados por joni (Java puerto de la Oniguruma regexp biblioteca). La documentación es escasa, pero ha funcionado bien para nosotros.
Los binarios están disponibles a través de Maven (http://repository.codehaus.org/org/jruby/joni/joni/).

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X