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

การค้นหาและแยกข้อมูล

FindString และส่วนที่จับคู่ย่อย

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

นอกเหนือจากการจับคู่

การจับคู่บอกคุณว่า มี รูปแบบอยู่หรือไม่ ส่วนกลุ่มฟังก์ชัน Find จะบอกว่า อะไรจับคู่ได้และอยู่ที่ใด คุณจึงสามารถดึงข้อมูลออกมาได้

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("[0-9]+")
    fmt.Println(re.FindString("order 42 ready"))
}

FindString

FindString(s) คืนค่าการจับคู่ครั้งแรกเป็นสตริง หรือคืนค่าสตริงว่างหากไม่พบ

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("[a-z]+")
    fmt.Printf("%q\n", re.FindString("123abc456"))
}

FindAllString

FindAllString(s, n) คืนค่าการจับคู่ทั้งหมดเป็นสไลซ์ ส่ง -1 เพื่อรับการจับคู่ทั้งหมด หรือส่งขีดจำกัดที่เป็นค่าบวก

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("[0-9]+")
    fmt.Println(re.FindAllString("a1 b22 c333", -1))
}

การจำกัดผลลัพธ์

ส่งค่า n ที่เป็นบวกเพื่อหยุดหลังจากพบการจับคู่ตามจำนวนดังกล่าว

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("[0-9]+")
    fmt.Println(re.FindAllString("1 2 3 4", 2))
}

การค้นหาดัชนี

FindStringIndex(s) คืนค่าตำแหน่งไบต์เริ่มต้นและสิ้นสุดของการจับคู่ครั้งแรกเป็นสไลซ์ที่มีสององค์ประกอบ

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("cat")
    fmt.Println(re.FindStringIndex("a cat here"))
}

กลุ่มจับ

วงเล็บใช้สร้าง กลุ่มจับ FindStringSubmatch จะคืนค่าการจับคู่ทั้งหมดก่อน แล้วจึงคืนค่าของแต่ละกลุ่มที่จับได้

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("(\\d+)-(\\d+)")
    m := re.FindStringSubmatch("12-34")
    fmt.Println(m)
}

การใช้ค่าการจับคู่ย่อย

เข้าถึงสมาชิกในสไลซ์ของการจับคู่ย่อยตามดัชนี: สมาชิกที่ 0 คือการจับคู่ทั้งหมด สมาชิกที่ 1 คือกลุ่มแรก และเรียงต่อไปในลักษณะเดียวกัน

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("(\\d+):(\\d+)")
    m := re.FindStringSubmatch("09:30")
    fmt.Println("hour", m[1], "min", m[2])
}

กลุ่มที่มีชื่อ

ตั้งชื่อกลุ่มด้วย (?P<name>...) จากนั้นอ่านค่าผ่าน SubexpNames ควบคู่กับสไลซ์ของการจับคู่ย่อย

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("(?P<area>\\d{3})-(?P<num>\\d{4})")
    m := re.FindStringSubmatch("555-1234")
    for i, name := range re.SubexpNames() {
        if name != "" {
            fmt.Println(name, m[i])
        }
    }
}

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

FindAllStringSubmatch(s, n) คืนค่าสไลซ์ของสไลซ์การจับคู่ย่อย โดยมีหนึ่งสไลซ์ต่อการจับคู่หนึ่งรายการ เหมาะอย่างยิ่งสำหรับแยกวิเคราะห์ระเบียนจำนวนมาก

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("(\\w+)=(\\d+)")
    all := re.FindAllStringSubmatch("x=1 y=2", -1)
    for _, m := range all {
        fmt.Println(m[1], m[2])
    }
}

พฤติกรรมเมื่อไม่พบการจับคู่

เมื่อไม่มีสิ่งใดจับคู่ได้ เมธอด Find จะคืนค่าสตริงว่างหรือสไลซ์ nil ควรตรวจสอบก่อนเข้าถึงสมาชิกตามดัชนี เพื่อหลีกเลี่ยงการหยุดทำงานของโปรแกรม

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("[0-9]+")
    m := re.FindStringSubmatch("no digits")
    fmt.Println(m == nil)
}

การดึงข้อมูลจริง

รวมกลุ่มต่าง ๆ เพื่อดึงฟิลด์ที่มีโครงสร้างออกจากบรรทัดข้อความ

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("(\\d{4})-(\\d{2})-(\\d{2})")
    m := re.FindStringSubmatch("date: 2026-05-30")
    fmt.Println("year", m[1])
}

ตรวจสอบความเข้าใจ

สมาชิกใดของสไลซ์การจับคู่ย่อยคือการจับคู่ทั้งหมด

สรุปทบทวน: การค้นหาและการดึงข้อมูล

ตอนนี้คุณสามารถดึงข้อมูลจากข้อความได้แล้ว:

  • FindString และ FindAllString คืนค่าการจับคู่
  • FindStringSubmatch คืนค่าการจับคู่ทั้งหมดพร้อมกลุ่มจับ
  • ใช้กลุ่มที่มีชื่อ และตรวจสอบค่า nil เมื่อไม่พบการจับคู่
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("(\\w+)@(\\w+)")
    m := re.FindStringSubmatch("user@host")
    fmt.Println(m[1], "at", m[2])
}

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

บทเรียน “การค้นหาและแยกข้อมูล” ฟรีหรือไม่

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

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

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

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

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

บทเรียน “การค้นหาและแยกข้อมูล” ใช้เวลานานแค่ไหน

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

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

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

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

  1. พื้นฐาน regexp
  2. การค้นหาและแยกข้อมูล
  3. การแทนที่ข้อความ
  4. เคล็ดลับด้านประสิทธิภาพ
← กลับไปที่ Go Academy