( अपडेट : अगस्त 2011 )
जैसा कि उनके जवाब में जियोफलेन का उल्लेख है , जावा 7 अब नामित समूहों का समर्थन करता है । टिचर टिप्पणी में बताते हैं कि समर्थन सीमित है।
वह अपने महान उत्तर " जावा रेगेक्स हेल्पर " में सीमाओं का विवरण देता है
सितंबर 2010 में ओरेकल के ब्लॉग में जावा 7 रेगेक्स नाम का ग्रुप सपोर्ट पेश किया गया था ।
जावा 7 की आधिकारिक रिलीज में, नामित कैप्चरिंग समूह का समर्थन करने के लिए निर्माण निम्नानुसार हैं:
(?<name>capturing text) एक नामित समूह "नाम" को परिभाषित करने के लिए
\k<name> एक नामित समूह "नाम" को पीछे हटाना
${name} मिलानकर्ता के प्रतिस्थापन स्ट्रिंग में कैप्चर किए गए समूह के संदर्भ में
Matcher.group(String name) दिए गए "नामित समूह" द्वारा कैप्चर किए गए इनपुट बाद को वापस करने के लिए।
पूर्व जावा 7 के लिए अन्य विकल्प थे:
( मूल उत्तर : जनवरी 2009 , अगले दो लिंक अब टूट गए)
आप नामित समूह का उल्लेख नहीं कर सकते, जब तक कि आप रेगेक्स का अपना संस्करण कोड न करें ...
इस धागे में गोरबश 2 ने ठीक यही किया है ।
Regex2
(सीमित कार्यान्वयन, जैसा कि tchrist द्वारा फिर से बताया गया है , क्योंकि यह केवल ASCII पहचानकर्ताओं के लिए दिखता है। tchrist सीमा का विवरण देता है:
केवल एक ही नाम प्रति समूह में सक्षम होने के नाते (जिसे आप हमेशा नियंत्रण नहीं रखते हैं!) और उन्हें इन-रेगेक्स पुनरावृत्ति के लिए उपयोग करने में सक्षम नहीं किया जा रहा है।
ध्यान दें: आप पर्ल और पीसीआरई रेगेक्स में सही रेगेक्स रिकर्सन उदाहरण पा सकते हैं, जैसा कि रेगेक्सप पावर , पीसीआरई स्पेक्स और बैलेंसिंग पेरेंटेस स्लाइड के साथ मिलान स्ट्रिंग्स में वर्णित है )
उदाहरण:
स्ट्रिंग:
"TEST 123"
RegExp:
"(?<login>\\w+) (?<id>\\d+)"
पहुंच
matcher.group(1) ==> TEST
matcher.group("login") ==> TEST
matcher.name(1) ==> login
बदलने के
matcher.replaceAll("aaaaa_$1_sssss_$2____") ==> aaaaa_TEST_sssss_123____
matcher.replaceAll("aaaaa_${login}_sssss_${id}____") ==> aaaaa_TEST_sssss_123____
(कार्यान्वयन से निकालें)
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;
}