Grupos Nomeados Regex em Java

É meu entendimento que o pacote java.regex não tem suporte para grupos nomeados ( http://www.regular-expressions.info/named.html ) para que alguém possa me apontar para uma biblioteca de terceiros que faz isso?

Eu olhei para jregex mas seu último lançamento foi em 2002 e não funcionou para mim (reconhecidamente eu tentei apenas brevemente) sob java5.

( Atualização : agosto de 2011 )

Como geofflane menciona em sua resposta , o Java 7 agora suporta grupos nomeados .
Tchrist aponta no comentário que o suporte é limitado.
Ele detalha as limitações em sua grande resposta ” Java Regex Helper “

O suporte ao grupo denominado regex do Java 7 foi apresentado em setembro de 2010 no blog da Oracle .

No release oficial do Java 7, as construções para suportar o grupo de captura nomeado são:

  • (?capturing text) para definir um grupo nomeado “nome”
  • \k para referenciar um nome de grupo “nome”
  • ${name} para fazer referência ao grupo capturado na string de substituição do Matcher
  • Matcher.group(String name) para retornar a subsequência da input capturada pelo “grupo nomeado”.

Outras alternativas para o pré-Java 7 foram:

  • Google nome-regex (veja a resposta de John Hardy )
    Gábor Lipták menciona (novembro de 2012) que este projeto pode não estar ativo (com vários bugs pendentes ), e seu fork do GitHub poderia ser considerado.
  • jregex (Veja a resposta de Brian Clozel )

( Resposta original : janeiro de 2009 , com os próximos dois links agora quebrados)

Você não pode se referir ao grupo nomeado, a menos que você codifique sua própria versão do Regex …

Isso é precisamente o que Gorbush2 fez neste tópico .

Regex2

(implementação limitada, como apontado novamente por tchrist , pois procura apenas identificadores ASCII. tchrist detalha a limitação como:

somente sendo capaz de ter um grupo nomeado com o mesmo nome (que você nem sempre controla!) e não ser capaz de usá-los para a recursion in-regex.

Nota: Você pode encontrar exemplos reais de recursion regex em regexes Perl e PCRE, como mencionado em Regexp Power , especificações PCRE e slide Correspondência de Strings com Parênteses Equilibrados )

Exemplo:

Corda:

 "TEST 123" 

RegExp:

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

Acesso

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

Substituir

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

(extrair da implementação)

 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; } 

Sim, mas é confuso invadir as classs de sol. Existe uma maneira mais simples:

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

O named-regexp é um wrapper fino para a implementação de expressões regulares do JDK padrão, com o propósito único de manipular grupos de captura nomeados no estilo .net: (? …).

Pode ser usado com Java 5 e 6 (os genéricos são usados).

O Java 7 lidará com grupos de captura nomeados, portanto, esse projeto não deve durar.

Para as pessoas que chegam tão tarde: o Java 7 adiciona grupos nomeados. Documentação do Matcher.group (String groupName).

Que tipo de problema você tem com o jregex ? Funcionou bem para mim em java5 e java6.

Jregex faz o trabalho bem (mesmo se a última versão for de 2002), a menos que você queira esperar pelo javaSE 7 .

Para aqueles que executam o pré-java7, os grupos nomeados são suportados pelo joni (porta Java da biblioteca regexp Oniguruma ). A documentação é esparsa, mas funcionou bem para nós.
Os binários estão disponíveis via Maven ( http://repository.codehaus.org/org/jruby/joni/joni/ ).

Uma pergunta um pouco antiga, mas eu me vi precisando disso também e que as sugestões acima eram inadequadas – e como tal – desenvolvi um wrapper fino: https://github.com/hofmeister/MatchIt