( Güncelleme : Ağustos 2011 )
As geofflane bahsedildi onun cevabı , Java 7 şimdi adlandırılmış gruplara destek .
tchrist yorumda desteğin sınırlı olduğunu belirtiyor.
O onun büyük yanıtında sınırlamalar ayrıntıları " Java Regex Yardımcısı "
Java 7 regex adlı grup desteği Eylül 2010'da Oracle'ın blogunda sunuldu .
Java 7'nin resmi sürümünde, belirtilen yakalama grubunu destekleyen yapılar şunlardır:
(?<name>capturing text)
adlandırılmış grup "adı" tanımlamak için
\k<name>
adlandırılmış bir grup "adı" na başvurmak
${name}
Eşleştiricinin değiştirme dizesindeki yakalanan gruba başvurma
Matcher.group(String name)
yakalanan girdi dizisini verilen "adlandırılmış grup" tarafından döndürmek için.
Java 7 öncesi için diğer alternatifler :
( Orijinal cevap : Ocak 2009 , şimdi sonraki iki bağlantı koptu)
Kendi Regex sürümünüzü kodlamadığınız sürece adlandırılmış gruba başvuramazsınız ...
Gorbush2'nin bu konuda yaptığı tam da budur .
Regex2
( sadece ASCII tanımlayıcıları için göründüğü için, tchrist tarafından tekrar belirtildiği gibi sınırlı uygulama . tchrist sınırlamayı şu şekilde detaylandırır:
aynı isim başına sadece adlandırılmış bir gruba sahip olmak (her zaman üzerinde kontrolünüz yoktur!) ve bunları normal ifade içi özyineleme için kullanamamak.
Not: Regexp Power , PCRE özellikleri ve Dengeli Parantezlerle Eşleşen Dizelerde belirtildiği gibi Perl ve PCRE normal ifadelerinde gerçek normal ifade özyineleme örneklerini bulabilirsiniz )
Misal:
Dize:
"TEST 123"
RegExp:
"(?<login>\\w+) (?<id>\\d+)"
Giriş
matcher.group(1) ==> TEST
matcher.group("login") ==> TEST
matcher.name(1) ==> login
değiştirmek
matcher.replaceAll("aaaaa_$1_sssss_$2____") ==> aaaaa_TEST_sssss_123____
matcher.replaceAll("aaaaa_${login}_sssss_${id}____") ==> aaaaa_TEST_sssss_123____
(uygulamadan alıntı)
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;
}