( Pembaruan : Agustus 2011 )
Seperti yang disebutkan geofflane dalam jawabannya , Java 7 sekarang mendukung kelompok bernama .
tchrist menunjukkan dalam komentar bahwa dukungan terbatas.
Dia merinci batasan dalam jawaban besarnya " Java Regex Helper "
Java 7 regex bernama dukungan kelompok disajikan kembali pada bulan September 2010 di blog Oracle .
Dalam rilis resmi Java 7, konstruk untuk mendukung grup penangkap bernama adalah:
(?<name>capturing text)
untuk mendefinisikan grup bernama "nama"
\k<name>
untuk mereferensi grup "nama" yang diberi nama
${name}
untuk referensi ke grup yang ditangkap dalam string pengganti Matcher
Matcher.group(String name)
untuk mengembalikan input yang ditangkap selanjutnya oleh "grup bernama" yang diberikan.
Alternatif lain untuk pra-Jawa 7 adalah:
( Jawaban asli : Jan 2009 , dengan dua tautan berikutnya sekarang terputus)
Anda tidak dapat merujuk ke grup yang disebutkan, kecuali jika Anda membuat kode versi Regex ...
Itulah tepatnya yang dilakukan Gorbush2 di utas ini .
Regex2
(implementasi terbatas, seperti yang ditunjukkan lagi oleh tchrist , karena hanya terlihat untuk pengidentifikasi ASCII. tchrist merinci batasannya sebagai:
hanya dapat memiliki satu grup bernama per nama yang sama (yang tidak selalu Anda kendalikan!) dan tidak dapat menggunakannya untuk rekursi in-regex.
Catatan: Anda dapat menemukan contoh rekursi regex sejati di Perl dan regex PCRE, sebagaimana disebutkan dalam Regexp Power , spesifikasi PCRE , dan String Pencocokan dengan slide Parentheses Seimbang )
Contoh:
Tali:
"TEST 123"
RegExp:
"(?<login>\\w+) (?<id>\\d+)"
Mengakses
matcher.group(1) ==> TEST
matcher.group("login") ==> TEST
matcher.name(1) ==> login
Menggantikan
matcher.replaceAll("aaaaa_$1_sssss_$2____") ==> aaaaa_TEST_sssss_123____
matcher.replaceAll("aaaaa_${login}_sssss_${id}____") ==> aaaaa_TEST_sssss_123____
(ekstrak dari implementasi)
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;
}