( อัปเดต : สิงหาคม 2554 )
ในฐานะที่เป็นgeofflaneกล่าวถึงในคำตอบของเขา , Java 7 ในขณะนี้สนับสนุนกลุ่มชื่อ
tchristชี้ให้เห็นในความคิดเห็นว่าการสนับสนุนมี จำกัด
เขาให้รายละเอียดข้อ จำกัด ในคำตอบที่ยอดเยี่ยม " Java Regex Helper "
Java 7 regex สนับสนุนการตั้งชื่อกลุ่มที่ถูกนำเสนอกลับมาในกันยายน 2010ในบล็อกของออราเคิล
ใน Java 7 รีลีสอย่างเป็นทางการโครงสร้างเพื่อสนับสนุนกลุ่มการดักจับที่ระบุชื่อคือ:
(?<name>capturing text)
เพื่อกำหนดกลุ่มชื่อ "ชื่อ"
\k<name>
เพื่อ backreference กลุ่ม "name" ที่มีชื่อ
${name}
อ้างอิงถึงกลุ่มที่ถูกจับในสตริงการแทนที่ของ Matcher
Matcher.group(String name)
เพื่อส่งกลับลำดับที่ถูกบันทึกโดย "กลุ่มที่มีชื่อ" ที่กำหนด
ทางเลือกอื่นสำหรับ pre-Java 7คือ:
( คำตอบดั้งเดิม : ม.ค. 2009โดยมีลิงก์สองลิงก์เสีย)
คุณไม่สามารถอ้างถึงกลุ่มที่มีชื่อเว้นแต่ว่าคุณจะรหัส Regex เวอร์ชันของคุณเอง ...
นั่นคือสิ่งที่Gorbush2 ทำในหัวข้อนี้
Regex2
(การใช้งานที่ จำกัด ตามที่tchristชี้ให้เห็นอีกครั้งเนื่องจากเป็นเพียงตัวระบุ ASCII เท่านั้น tchrist มีรายละเอียดข้อ จำกัด ดังนี้:
ความสามารถในการมีกลุ่มที่มีชื่อหนึ่งกลุ่มต่อชื่อเดียวกันเท่านั้น (ซึ่งคุณไม่สามารถควบคุมได้เสมอ!) และไม่สามารถใช้พวกเขาสำหรับการเรียกซ้ำแบบ in-regex
หมายเหตุ: คุณสามารถค้นหาตัวอย่างการเรียกซ้ำที่แท้จริงของ regex ใน Perl และ PCRE regexes ตามที่กล่าวไว้ในRegexp Power , ข้อมูลจำเพาะ PCREและการจับคู่สตริงที่มีสไลด์ที่สมดุลวงเล็บ )
ตัวอย่าง:
สตริง:
"TEST 123"
นิพจน์ทั่วไป:
"(?<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;
}