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

การคอมไพล์รูปแบบ

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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