กลุ่มในนิพจน์ทั่วไปเป็นแนวคิดที่สำคัญมาก และเป็นสะพานเชื่อมไปยังแอปพลิเคชันนิพจน์ทั่วไปขั้นสูง
แนวคิดของกลุ่ม
ผลลัพธ์การจับคู่นิพจน์ทั่วไปสามารถแบ่งออกเป็นหลายส่วนได้ หลังจากที่คุณสามารถใช้กลุ่มได้อย่างยืดหยุ่นแล้ว คุณจะพบว่า Regex สะดวกและทรงพลังจริงๆ
มาดูตัวอย่างกันก่อน:
public static void Main()
-
สตริง s = "2005-2-21";
Regex reg = Regex ใหม่(@"(?<y>d{4})-(?<m>d{1,2})-(?<d>d{1,2})",RegexOptions .เรียบเรียง);
จับคู่ จับคู่ = reg.Match(s);
int year = int.Parse(match.Groups["y"].Value);
int month = int.Parse(match.Groups["m"].Value);
int day = int .Parse(match.Groups["d"].Value);
DateTime time = DateTime ใหม่ (ปี, เดือน, วัน);
Console.WriteLine (เวลา);
Console.ReadLine();
}
ตัวอย่างข้างต้นวิเคราะห์สตริงผ่านกลุ่มและแปลงเป็นอินสแตนซ์ DateTime แน่นอนว่าฟังก์ชันนี้สามารถนำไปใช้งานได้อย่างง่ายดายโดยใช้เมธอด DateTime.Parse
ในตัวอย่างนี้ ฉันใช้ (?<name>) เพื่อแบ่งผลลัพธ์ของการจับคู่ออกเป็นสามกลุ่มคือ "y", "m" และ "d" แทนปี เดือน และวันตามลำดับ
ตอนนี้เรามีแนวคิดเกี่ยวกับกลุ่มแล้ว มาดูวิธีจัดกลุ่มพวกมันกันดีกว่า นอกเหนือจากวิธีการข้างต้นแล้ว เรายังสามารถกำหนดกลุ่มด้วยวงเล็บคู่ได้ ตัวอย่างเช่น ตัวอย่างข้างต้นสามารถเปลี่ยนเป็น:
โมฆะคงที่สาธารณะ Main()
-
สตริง s = "2005-2-21";
Regex reg = Regex ใหม่(@"(d{4})-(d{1,2})-(d{1,2})",RegexOptions.Compiled);
จับคู่ จับคู่ = reg.Match(s);
int year = int.Parse(match.Groups[1].Value);
int month = int.Parse(match.Groups[2].Value);
int day = int .Parse(match.Groups[3].Value);
DateTime time = DateTime ใหม่ (ปี, เดือน, วัน);
Console.WriteLine (เวลา);
Console.ReadLine();
}
ดังที่เห็นได้จากตัวอย่างข้างต้น กลุ่มที่อยู่ในวงเล็บคู่แรกจะมีหมายเลข 1 โดยอัตโนมัติ และวงเล็บต่อไปนี้จะมีหมายเลข 2, 3...
public static void Main()
-
สตริง s = "2005-2-21";
Regex reg = Regex ใหม่(@"(?<2>d{4})-(?<1>d{1,2})-(?<3>d{1,2})",RegexOptions .เรียบเรียง);
จับคู่ จับคู่ = reg.Match(s);
int year = int.Parse(match.Groups[2].Value);
int month = int.Parse(match.Groups[1].Value);
int day = int .Parse(match.Groups[3].Value);
DateTime time = DateTime ใหม่ (ปี, เดือน, วัน);
Console.WriteLine (เวลา);
Console.ReadLine();
}
ดูตัวอย่างข้างต้นอีกครั้ง เราใช้ (?<number>) เพื่อกำหนดหมายเลขกลุ่มของคู่วงเล็บแต่ละคู่ด้วยตนเอง (โปรดทราบว่าฉันไม่ได้กำหนดตำแหน่งของ 1 และ 2 จากซ้ายไปขวา)
จากตัวอย่างทั้งสามข้างต้น เราทราบสามวิธีในการกำหนดกลุ่มสำหรับ Regex และวิธีที่เกี่ยวข้องในการอ้างอิงผลลัพธ์การจับคู่กลุ่ม
จากนั้น เกี่ยวกับคำจำกัดความของกลุ่ม โปรดสังเกตอีกสองประเด็น:
1. เนื่องจากมีการใช้วงเล็บเพื่อกำหนดกลุ่ม ดังนั้นหากคุณต้องการจับคู่ "(" และ ")" โปรดใช้ "(" และ ")" (ประมาณทั้งหมด พิเศษ สำหรับคำจำกัดความของอักขระ โปรดตรวจสอบเอกสารวิธีใช้นิพจน์ Regex ที่เกี่ยวข้อง)
2. หากใช้ตัวเลือก ExplicitCapture เมื่อกำหนด Regex ตัวอย่างที่สองจะไม่สำเร็จ เนื่องจากตัวเลือกนี้จำเป็นต้องมีกลุ่มที่กำหนดไว้อย่างชัดเจนพร้อมหมายเลขหรือชื่อเพื่อบันทึกและบันทึกผลลัพธ์ หากคุณไม่ได้กำหนดตัวเลือก ExplicitCapture และในบางครั้ง หากคุณกำหนดนิพจน์ที่คล้ายกับ (A|B) และคุณไม่ต้องการบันทึกผลลัพธ์ของสิ่งนี้ (A|B) คุณสามารถใช้ไวยากรณ์ "non-capturing group" ซึ่งกำหนดเป็น ( ?:) วิธีการสำหรับ (A|B) คุณสามารถกำหนดได้เช่นนี้เพื่อให้บรรลุวัตถุประสงค์ของการไม่บันทึกและบันทึกลงในคอลเลกชันกลุ่ม - (?:A|B)