( Aggiornamento : agosto 2011 )
Come menziona geofflane nella sua risposta , Java 7 ora supporta gruppi denominati .
tchrist sottolinea nel commento che il supporto è limitato.
Descrive in dettaglio i limiti nella sua grande risposta " Java Regex Helper "
Il supporto del gruppo denominato regex Java 7 è stato presentato nel settembre 2010 nel blog di Oracle .
Nella versione ufficiale di Java 7, i costrutti per supportare il gruppo di acquisizione denominato sono:
(?<name>capturing text) definire un "nome" di gruppo denominato
\k<name> per fare riferimento a un gruppo denominato "nome"
${name} per fare riferimento al gruppo acquisito nella stringa di sostituzione del Matcher
Matcher.group(String name) per restituire la sottosequenza di input acquisita dal "gruppo denominato" indicato.
Altre alternative per pre-Java 7 erano:
( Risposta originale : gennaio 2009 , con i due collegamenti successivi ora interrotti)
Non è possibile fare riferimento al gruppo denominato, a meno che non si codifichi la propria versione di Regex ...
Questo è esattamente ciò che Gorbush2 ha fatto in questo thread .
Regex2
(implementazione limitata, come sottolineato ancora da tchrist , in quanto cerca solo identificatori ASCII. tchrist specifica la limitazione come:
solo essere in grado di avere un gruppo nominato per lo stesso nome (di cui non si ha sempre il controllo!) e non essere in grado di usarli per la ricorsione in-regex.
Nota: è possibile trovare veri esempi di ricorsione regex nelle regex Perl e PCRE, come indicato in Regexp Power , specifiche PCRE e stringhe di corrispondenza con diapositiva Parentesi bilanciate )
Esempio:
Corda:
"TEST 123"
RegExp:
"(?<login>\\w+) (?<id>\\d+)"
Accesso
matcher.group(1) ==> TEST
matcher.group("login") ==> TEST
matcher.name(1) ==> login
Sostituire
matcher.replaceAll("aaaaa_$1_sssss_$2____") ==> aaaaa_TEST_sssss_123____
matcher.replaceAll("aaaaa_${login}_sssss_${id}____") ==> aaaaa_TEST_sssss_123____
(estratto dall'attuazione)
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;
}