0Pricing
Swift Academy · บทเรียน

กลุ่มการจับคู่

ดึงสตริงย่อยจากผลการจับคู่

กลุ่มการจับคู่ เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

กลุ่มจับค่า

วงเล็บในนิพจน์ทั่วไปจะสร้าง กลุ่มจับค่า แต่ละกลุ่มจะจดจำสตริงย่อยที่จับคู่ได้ ทำให้คุณดึงส่วนประกอบที่มีโครงสร้างออกจากการจับคู่ขนาดใหญ่ได้

การจับค่าหนึ่งรายการ

การครอบส่วนหนึ่งของรูปแบบด้วย () จะจับค่าส่วนนั้น ผลลัพธ์การจับคู่จะกลายเป็นทูเพิล โดยมีการจับคู่ทั้งหมดอยู่ก่อน แล้วจึงตามด้วยค่าที่จับได้แต่ละรายการ

if let m = "v2".firstMatch(of: /v(\d+)/) {
    print("Whole: \(m.0)")
    print("Group: \(m.1)")
}

การจับค่าหลายรายการ

วงเล็บแต่ละคู่จะเพิ่มองค์ประกอบอีกหนึ่งรายการให้ทูเพิลผลลัพธ์ โดยเรียงจากซ้ายไปขวา

if let m = "2024-05-30".wholeMatch(of: /(\d{4})-(\d{2})-(\d{2})/) {
    print("Year: \(m.1)")
    print("Month: \(m.2)")
    print("Day: \(m.3)")
}

การจับคู่ทั้งหมดคือ .0

องค์ประกอบ .0 ของผลลัพธ์จะเป็นข้อความที่จับคู่ได้ทั้งหมดเสมอ ส่วนค่าที่จับได้จะเริ่มที่ .1

if let m = "key=value".wholeMatch(of: /(\w+)=(\w+)/) {
    print("Full: \(m.0)")
    print("Key: \(m.1), Value: \(m.2)")
}

ค่าที่จับได้คือสตริงย่อย

โดยค่าเริ่มต้น ค่าที่จับได้จะเป็นค่า Substring ที่ชี้ไปยังตำแหน่งภายในสตริงต้นฉบับ ให้แปลงด้วย String(...) หากต้องการเก็บค่าเหล่านั้นไว้

if let m = "abc123".firstMatch(of: /([a-z]+)(\d+)/) {
    let letters = String(m.1)
    let numbers = String(m.2)
    print(letters, numbers)
}

ค่าที่จับได้แบบเลือกได้

หากกลุ่มเป็นแบบเลือกได้ (ตามด้วย ?) ค่าที่จับได้อาจเป็น nil เมื่อกลุ่มนั้นไม่ได้เข้าร่วมการจับคู่

if let m = "color".wholeMatch(of: /colou?(r)/) {
    print("Captured: \(m.1)")
}

ค่าที่จับได้ที่มีชื่อ

คุณสามารถตั้งชื่อให้กลุ่มด้วย (?<name>...) และอ่านค่าผ่านผลลัพธ์ที่มีชื่อ ซึ่งชัดเจนกว่าการใช้ดัชนีตัวเลข

let re = /(?<area>\d{3})-(?<line>\d{4})/
if let m = "555-1234".wholeMatch(of: re) {
    print("Area: \(m.area)")
    print("Line: \(m.line)")
}

การวนซ้ำผ่านค่าที่จับได้

ผสานค่าที่จับได้เข้ากับ matches(of:) เพื่อดึงข้อมูลที่มีโครงสร้างจากการจับคู่จำนวนมากได้ในครั้งเดียว

let log = "a=1 b=2 c=3"
for m in log.matches(of: /(\w+)=(\d+)/) {
    print("\(m.1) -> \(m.2)")
}

กลุ่มซ้อนกัน

กลุ่มสามารถซ้อนกันได้ กลุ่มภายนอกจะจับค่าทั้งหมด ส่วนกลุ่มภายในจะจับค่าเป็นส่วน ๆ การกำหนดหมายเลขจะเป็นไปตามลำดับของวงเล็บเปิด

if let m = "12:30".wholeMatch(of: /((\d+):(\d+))/) {
    print("All: \(m.1)")
    print("H: \(m.2), M: \(m.3)")
}

กลุ่มที่ไม่จับค่า

ใช้ (?:...) เพื่อจัดกลุ่มโดยไม่จับค่า เมื่อคุณต้องการจัดกลุ่มสำหรับตัวระบุจำนวนการทำซ้ำเท่านั้น และไม่ต้องการเพิ่มองค์ประกอบในทูเพิล

if let m = "abab".wholeMatch(of: /(?:ab)+/) {
    print("Matched: \(m.0)")
}

การสร้างตัวแยกวิเคราะห์

ค่าที่จับได้จะเปลี่ยนข้อความดิบให้เป็นค่าที่มีชนิด ในที่นี้เราจะแยกวิเคราะห์สตริงพิกัดให้เป็นจำนวนเต็ม

func parsePoint(_ s: String) -> (Int, Int)? {
    guard let m = s.wholeMatch(of: /(\d+),(\d+)/),
          let x = Int(m.1), let y = Int(m.2) else { return nil }
    return (x, y)
}
print(parsePoint("3,7") ?? "nil")

ตรวจสอบอย่างรวดเร็ว

สำหรับรูปแบบ /(\d{4})-(\d{2})/ ที่จับคู่กับ "2024-05" ค่า m.2 คืออะไร?

สรุป

วงเล็บจะสร้าง กลุ่มจับค่าที่เข้าถึงได้ในรูปแบบทูเพิล โดย .0 คือการจับค่าทั้งหมด และ .1, .2... คือค่าที่จับได้ คุณได้เห็นกลุ่มที่มีชื่อ กลุ่มแบบเลือกได้ กลุ่มซ้อนกัน และกลุ่มที่ไม่จับค่าแล้ว ถัดไป คุณจะสร้างนิพจน์ทั่วไปจากโค้ด Swift ที่อ่านง่ายด้วย RegexBuilder

คำถามที่พบบ่อย

บทเรียน “กลุ่มการจับคู่” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “กลุ่มการจับคู่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “กลุ่มการจับคู่”

ดึงสตริงย่อยจากผลการจับคู่ คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “กลุ่มการจับคู่” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ค่าคงที่ Regex และการจับคู่
  2. กลุ่มการจับคู่
  3. DSL สำหรับ RegexBuilder
  4. การแทนที่และแบ่งข้อความ
← กลับไปที่ Swift Academy