การแทนที่ด้วยนิพจน์ปกติ
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การคอมไพล์รูปแบบ
- การค้นหาและการจับคู่
- กลุ่มจับข้อความ
- การแทนที่ด้วยนิพจน์ปกติ