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

กลุ่มจับข้อความ

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

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

กลุ่มจับค่าคืออะไร

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

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d+)-(\\d+)").matcher("42-99");
        if (m.find()) {
            System.out.println(m.group(1));
            System.out.println(m.group(2));
        }
    }
}

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

group(0) (หรือ group()) จะส่งคืนข้อความที่จับคู่ได้ทั้งหมด กลุ่มที่มีหมายเลขจะเริ่มต้นที่ 1

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d+)px").matcher("width: 24px");
        if (m.find()) {
            System.out.println(m.group(0));
            System.out.println(m.group(1));
        }
    }
}

การนับกลุ่ม

groupCount() รายงานจำนวนกลุ่มจับค่าใน pattern โดยไม่นับกลุ่ม 0

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})").matcher("2026-05-30");
        if (m.find()) System.out.println(m.groupCount());
    }
}

การแยกวิเคราะห์วันที่

กลุ่มจับค่าช่วยให้แบ่งค่าที่จัดรูปแบบแล้วออกเป็นส่วนต่าง ๆ ได้ง่าย

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})").matcher("2026-05-30");
        if (m.matches()) {
            System.out.println("year=" + m.group(1));
            System.out.println("month=" + m.group(2));
            System.out.println("day=" + m.group(3));
        }
    }
}

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

ตั้งชื่อกลุ่มด้วย (?<name>...) แล้วดึงค่าด้วยชื่อ วิธีนี้ทำให้ pattern อ่านเข้าใจได้ง่ายขึ้นมาก

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("(?<user>\\w+)@(?<host>\\w+\\.\\w+)");
        Matcher m = p.matcher("alice@example.com");
        if (m.find()) {
            System.out.println(m.group("user"));
            System.out.println(m.group("host"));
        }
    }
}

ขอบเขตของกลุ่ม

start(n) และ end(n) จะระบุช่วงดัชนีของกลุ่มที่ต้องการภายในข้อมูลขาเข้า

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d+)").matcher("abc123");
        if (m.find()) {
            System.out.println(m.start(1) + " to " + m.end(1));
        }
    }
}

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

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

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(?:Mr|Ms)\\.? (\\w+)").matcher("Ms. Smith");
        if (m.find()) System.out.println(m.group(1));
    }
}

กลุ่มที่ไม่บังคับอาจเป็นค่าว่าง

หากกลุ่มเป็นส่วนที่ไม่บังคับและไม่ได้เข้าร่วมในการจับคู่ group(n) จะส่งคืน null ให้จัดการกรณีนี้เสมอ

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d+)(px)?").matcher("50");
        if (m.matches()) {
            System.out.println(m.group(1));
            System.out.println(m.group(2));
        }
    }
}

การวนดูการจับคู่พร้อมกลุ่ม

ใช้ find ในลูปร่วมกับการดึงค่ากลุ่ม เพื่อดึงโทเค็นที่มีโครงสร้างออกจากข้อความที่ยาวกว่า

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\w+)=(\\d+)").matcher("a=1 b=2 c=3");
        while (m.find()) {
            System.out.println(m.group(1) + " -> " + m.group(2));
        }
    }
}

การอ้างอิงย้อนกลับใน Pattern

ภายในนิพจน์ทั่วไป \1 จะจับคู่ข้อความเดียวกับที่กลุ่มก่อนหน้าจับค่าไว้ วิธีนี้ใช้ตรวจจับการซ้ำ เช่น คำที่ปรากฏติดกันสองครั้ง

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\w+) \\1").matcher("the the cat");
        System.out.println(m.find());
        System.out.println(m.group(1));
    }
}

การจับค่าลงในระเบียน

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

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    record Point(int x, int y) {}

    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\((\\d+),(\\d+)\\)").matcher("(3,7)");
        if (m.matches()) {
            Point p = new Point(Integer.parseInt(m.group(1)), Integer.parseInt(m.group(2)));
            System.out.println(p);
        }
    }
}

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

group(0) ส่งคืนค่าใดหลังจากจับคู่สำเร็จ

สรุปทบทวน

คุณได้ดึงสตริงย่อยที่จับคู่ได้ดังนี้:

  • วงเล็บจะสร้างกลุ่มที่มีหมายเลข group(0) คือการจับคู่ทั้งหมด ส่วนหมายเลข 1 ขึ้นไปคือกลุ่มจับค่า
  • (?<name>...) จะสร้างกลุ่มที่มีชื่อ ซึ่งอ่านค่าผ่าน group("name")
  • (?:...) จะจัดกลุ่มโดยไม่จับค่า
  • กลุ่มที่ไม่บังคับอาจเป็น null ส่วน \1 จะอ้างอิงย้อนกลับไปยังกลุ่มก่อนหน้า

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

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

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

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

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

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

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

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

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

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

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

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

  1. การคอมไพล์รูปแบบ
  2. การค้นหาและการจับคู่
  3. กลุ่มจับข้อความ
  4. การแทนที่ด้วยนิพจน์ปกติ
← กลับไปที่ Java Academy