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

การแทนที่ด้วยนิพจน์ปกติ

replaceAll และการอ้างอิงย้อนกลับ

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

การแทนที่ด้วยนิพจน์ทั่วไป

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

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("a1b22c333");
        System.out.println(m.replaceAll("#"));
    }
}

ทางลัด String.replaceAll

String.replaceAll(regex, replacement) เป็นคำสั่งบรรทัดเดียวที่สะดวก โดยจะคอมไพล์ pattern ภายใน

public class Main {
    public static void main(String[] args) {
        String cleaned = "hello   world  again".replaceAll("\\s+", " ");
        System.out.println(cleaned);
    }
}

replaceFirst

replaceFirst จะแทนที่เฉพาะการจับคู่ครั้งแรก และปล่อยการจับคู่ที่ตามมาไว้เหมือนเดิม

public class Main {
    public static void main(String[] args) {
        String s = "cat cat cat".replaceFirst("cat", "dog");
        System.out.println(s);
    }
}

การอ้างอิงกลุ่มในการแทนที่

ในสตริงแทนที่ $1, $2 และอื่น ๆ จะแทรกข้อความที่กลุ่มเหล่านั้นจับค่าไว้ วิธีนี้ช่วยจัดลำดับใหม่หรือจัดรูปแบบเนื้อหาที่จับคู่ได้

public class Main {
    public static void main(String[] args) {
        String iso = "30/05/2026".replaceAll("(\\d{2})/(\\d{2})/(\\d{4})", "$3-$2-$1");
        System.out.println(iso);
    }
}

การอ้างอิงกลุ่มที่มีชื่อ

คุณยังสามารถอ้างอิงกลุ่มที่มีชื่อในข้อความแทนที่ด้วย ${name} ได้

public class Main {
    public static void main(String[] args) {
        String r = "alice@example.com"
            .replaceAll("(?<user>\\w+)@(?<host>[\\w.]+)", "${user} at ${host}");
        System.out.println(r);
    }
}

การเอสเคปเครื่องหมายดอลลาร์และแบ็กสแลช

เนื่องจาก $ และ \ เป็นอักขระพิเศษในข้อความแทนที่ ให้เอสเคปเครื่องหมายดอลลาร์ตามตัวอักษรเป็น \$ โดย Matcher.quoteReplacement จะเอสเคปอักขระเหล่านี้ให้คุณ

import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        String price = "100".replaceAll("\\d+", Matcher.quoteReplacement("$100"));
        System.out.println(price);
    }
}

การแทนที่ที่คำนวณด้วยฟังก์ชัน replaceAll

ตั้งแต่ Java 9 เป็นต้นมา Matcher.replaceAll รับฟังก์ชันได้ ทำให้คุณคำนวณการแทนที่แต่ละรายการจากการจับคู่ได้

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("a1 b2 c3");
        String out = m.replaceAll(mr -> String.valueOf(Integer.parseInt(mr.group()) * 10));
        System.out.println(out);
    }
}

การเปลี่ยนคำที่จับคู่เป็นตัวพิมพ์ใหญ่

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

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\b\\w").matcher("hello there world");
        String title = m.replaceAll(mr -> mr.group().toUpperCase());
        System.out.println(title);
    }
}

appendReplacement และ appendTail

หากต้องการควบคุมอย่างเต็มที่ ให้ใช้ลูปร่วมกับ find และสร้างผลลัพธ์ผ่าน appendReplacement จากนั้นใช้ appendTail นี่คือเทคนิคระดับล่างแบบดั้งเดิม

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("a1b2");
        StringBuilder sb = new StringBuilder();
        while (m.find()) {
            m.appendReplacement(sb, "[" + m.group() + "]");
        }
        m.appendTail(sb);
        System.out.println(sb);
    }
}

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

การอ้างอิงย้อนกลับใน pattern (\1) จะจับคู่ข้อความที่ซ้ำกัน ซึ่งมีประโยชน์สำหรับการรวมคำซ้ำสองครั้งระหว่างการแทนที่

public class Main {
    public static void main(String[] args) {
        String fixed = "the the end end".replaceAll("\\b(\\w+) \\1\\b", "$1");
        System.out.println(fixed);
    }
}

การลบอักขระที่ไม่ต้องการ

การใช้งานที่พบบ่อยคือการทำความสะอาดข้อมูลขาเข้า โดยแทนที่ทุกอย่างที่อยู่นอกชุดอักขระที่อนุญาตด้วยค่าว่าง

public class Main {
    public static void main(String[] args) {
        String digits = "(555) 123-4567".replaceAll("[^0-9]", "");
        System.out.println(digits);
    }
}

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

ในสตริงแทนที่สำหรับ replaceAll $2 หมายถึงอะไร

สรุปทบทวน

คุณได้แปลงข้อความด้วยนิพจน์ทั่วไปดังนี้:

  • replaceAll และ replaceFirst จะแทนที่การจับคู่ ส่วน String มีทางลัดให้ใช้
  • $1 / ${name} จะแทรกกลุ่มจับค่าลงในการแทนที่ ให้เอสเคป $ ตามตัวอักษรเป็น \$ หรือใช้ quoteReplacement
  • รูปแบบฟังก์ชันของ replaceAll จะคำนวณการแทนที่จากการจับคู่แต่ละรายการ
  • appendReplacement + appendTail ให้การควบคุมด้วยตนเองอย่างเต็มที่

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

บทเรียน “การแทนที่ด้วยนิพจน์ปกติ” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การแทนที่ด้วยนิพจน์ปกติ”

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

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

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

บทเรียน “การแทนที่ด้วยนิพจน์ปกติ” ใช้เวลานานแค่ไหน

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

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

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

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

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