( Mise à jour : août 2011 )
Comme le mentionne geofflane dans sa réponse , Java 7 prend désormais en charge les groupes nommés .
tchrist souligne dans le commentaire que le support est limité.
Il détaille les limites dans sa grande réponse " Java Regex Helper "
Java 7 regex named group support a été présenté en septembre 2010 sur le blog d'Oracle .
Dans la version officielle de Java 7, les constructions pour prendre en charge le groupe de capture nommé sont:
(?<name>capturing text)
pour définir un groupe nommé "nom"
\k<name>
pour référencer un groupe nommé "nom"
${name}
pour faire référence au groupe capturé dans la chaîne de remplacement de Matcher
Matcher.group(String name)
pour renvoyer la sous-séquence d'entrée capturée par le "groupe nommé" donné.
D'autres alternatives pour pré-Java 7 étaient:
( Réponse originale : janvier 2009 , avec les deux liens suivants maintenant rompus)
Vous ne pouvez pas faire référence à un groupe nommé, sauf si vous codez votre propre version de Regex ...
C'est précisément ce que Gorbush2 a fait dans ce fil .
Regex2
(implémentation limitée, comme souligné à nouveau par tchrist , car il ne recherche que les identifiants ASCII. tchrist détaille la limitation comme:
ne pouvoir avoir qu'un seul groupe nommé par même nom (sur lequel vous n'avez pas toujours le contrôle!) et ne pas pouvoir les utiliser pour la récursivité in-regex.
Remarque: vous pouvez trouver de vrais exemples de récursions de regex dans les expressions régulières Perl et PCRE, comme mentionné dans la diapositive Regexp Power , PCRE specs and Matching Strings with Balanced Parentheses )
Exemple:
Chaîne:
"TEST 123"
RegExp:
"(?<login>\\w+) (?<id>\\d+)"
Accès
matcher.group(1) ==> TEST
matcher.group("login") ==> TEST
matcher.name(1) ==> login
Remplacer
matcher.replaceAll("aaaaa_$1_sssss_$2____") ==> aaaaa_TEST_sssss_123____
matcher.replaceAll("aaaaa_${login}_sssss_${id}____") ==> aaaaa_TEST_sssss_123____
(extrait de l'implémentation)
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;
}