การคอมไพล์รูปแบบ
Pattern.compile และ Matcher
การคอมไพล์รูปแบบ เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คู่ Pattern และ Matcher
นิพจน์ปกติของ Java อยู่ใน java.util.regex โดย Pattern คือนิพจน์ปกติที่คอมไพล์แล้ว ส่วน Matcher ใช้รูปแบบนั้นกับอินพุตที่ระบุ
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("abc123");
System.out.println(m.find());
}
}การคอมไพล์ครั้งเดียวและนำกลับมาใช้ซ้ำบ่อยครั้ง
Pattern.compile ใช้ทรัพยากรค่อนข้างมาก ให้ compile รูปแบบเพียง ครั้งเดียว แล้วนำกลับมาใช้กับข้อมูลขาเข้าหลายรายการ แทนการคอมไพล์ใหม่ภายในลูป
import java.util.regex.Pattern;
public class Main {
static final Pattern DIGITS = Pattern.compile("\\d+");
public static void main(String[] args) {
System.out.println(DIGITS.matcher("a1").find());
System.out.println(DIGITS.matcher("bb").find());
}
}การเอสเคปแบ็กสแลชใน Java
โทเค็นนิพจน์ทั่วไปอย่าง \d ต้องใช้แบ็กสแลช แต่สตริงของ Java ก็ใช้แบ็กสแลชสำหรับเอสเคปเช่นกัน ดังนั้นในซอร์สโค้ดให้เขียน \\d เพื่อสื่อถึงนิพจน์ทั่วไป \d
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Pattern word = Pattern.compile("\\w+");
System.out.println(word.matcher("hello").matches());
}
}การสร้าง Matcher
pattern.matcher(input) ผูก pattern เข้ากับสตริงข้อมูลขาเข้า และส่งคืน Matcher ใหม่ที่ติดตามตำแหน่งปัจจุบัน
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("the cat sat");
System.out.println(m.find());
}
}Matchers มีสถานะ
Matcher เก็บสถานะที่เปลี่ยนแปลงได้ เช่น ตำแหน่งปัจจุบันและการจับคู่ล่าสุด ให้สร้าง matcher ใหม่สำหรับข้อมูลขาเข้าแต่ละรายการ และอย่าใช้ตัวเดียวร่วมกันระหว่างเธรด
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d");
Matcher m = p.matcher("a1b2");
System.out.println(m.find());
System.out.println(m.find());
}
}แฟล็กไม่คำนึงถึงตัวพิมพ์เล็กใหญ่
ส่งแฟล็กเป็นอาร์กิวเมนต์ตัวที่สองให้กับ compile Pattern.CASE_INSENSITIVE จะไม่คำนึงถึงตัวพิมพ์เล็กใหญ่ของตัวอักษร
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
System.out.println(p.matcher("I love JAVA").find());
}
}การรวมแฟล็ก
รวมแฟล็กด้วยตัวดำเนินการ OR แบบระดับบิต ในที่นี้เราเพิ่ม MULTILINE เพื่อให้จุดยึดจับคู่ได้ที่แต่ละบรรทัด
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("^a", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
Matcher m = p.matcher("apple\nApricot");
int count = 0;
while (m.find()) count++;
System.out.println(count);
}
}ทางลัด matches แบบสแตติก
Pattern.matches(regex, input) เป็นตัวช่วยแบบเรียกครั้งเดียวที่คอมไพล์และทดสอบในคำสั่งเดียว สะดวก แต่จะคอมไพล์ใหม่ทุกครั้ง
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
System.out.println(Pattern.matches("\\d{3}", "123"));
System.out.println(Pattern.matches("\\d{3}", "12"));
}
}การแบ่งสตริงด้วย Pattern
Pattern ที่คอมไพล์แล้วสามารถแบ่งสตริงผ่าน split ได้ โดยนำ regex ที่คอมไพล์แล้วเดิมกลับมาใช้ซ้ำอย่างมีประสิทธิภาพ
import java.util.Arrays;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Pattern comma = Pattern.compile("\\s*,\\s*");
String[] parts = comma.split("a, b ,c, d");
System.out.println(Arrays.toString(parts));
}
}การตรวจสอบ Pattern
pattern() ส่งคืนสตริงนิพจน์ทั่วไปเดิม และ flags() ส่งคืนแฟล็กที่ใช้งานอยู่ในรูปจำนวนเต็ม
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);
System.out.println(p.pattern());
System.out.println(p.flags());
}
}รูปแบบที่ไม่ถูกต้องจะแจ้งข้อผิดพลาด
นิพจน์ทั่วไปที่มีรูปแบบไม่ถูกต้องจะแจ้งข้อผิดพลาดเป็น PatternSyntaxException ในเวลา compile ทำให้คุณตรวจจับข้อผิดพลาดได้ตั้งแต่เนิ่น ๆ
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class Main {
public static void main(String[] args) {
try {
Pattern.compile("[unclosed");
} catch (PatternSyntaxException e) {
System.out.println("Invalid regex");
}
}
}ตรวจสอบอย่างรวดเร็ว
เหตุใดคุณจึงควรคอมไพล์ regex ที่ใช้บ่อยเป็นฟิลด์ Pattern แบบสแตติก
สรุปทบทวน
คุณได้คอมไพล์รูปแบบดังนี้:
Pattern.compileสร้างรูปแบบที่นำกลับมาใช้ซ้ำได้ ไม่เปลี่ยนแปลง และปลอดภัยสำหรับหลายเธรด ส่วนmatcherจะผูกรูปแบบนั้นเข้ากับข้อมูลขาเข้า- เอสเคปแบ็กสแลชของนิพจน์ทั่วไปเป็น
\\ในซอร์สโค้ด Java - แฟล็กอย่าง
CASE_INSENSITIVEและMULTILINEสามารถรวมกันด้วย OR แบบระดับบิต Matcherมีสถานะ ดังนั้นให้สร้างหนึ่งตัวต่อข้อมูลขาเข้าแต่ละรายการ
คำถามที่พบบ่อย
บทเรียน “การคอมไพล์รูปแบบ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การคอมไพล์รูปแบบ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การคอมไพล์รูปแบบ”
Pattern.compile และ Matcher คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การคอมไพล์รูปแบบ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การคอมไพล์รูปแบบ
- การค้นหาและการจับคู่
- กลุ่มจับข้อความ
- การแทนที่ด้วยนิพจน์ปกติ