Java - Biểu thức Chính quy

Chào mừng, các nhà lập trình Java đam mê! Hôm nay, chúng ta sẽ bơi lội vào thế giới thú vị của Biểu thức Chính quy (Regex) trong Java. Đừng lo nếu bạn mới bắt đầu học lập trình; tôi sẽ hướng dẫn bạn qua cuộc hành trình này bước به bước, giống như tôi đã làm cho nhiều học viên khác trong những năm dạy học. Vậy, hãy lấy một chén cà phê, và hãy cùng nhau bắt đầu cuộc phiêu lưu thú vị này!

Java - Regular Expressions

Biểu thức Chính quy là gì?

Trước khi nhảy vào phần triển khai cụ thể của Java, hãy hiểu rõ về Biểu thức Chính quy. Hãy tưởng tượng bạn là một phát triển đang cố gắng tìm một mẫu cụ thể trong một bể văn bản lớn. Đó chính là điều mà Regex làm – nó là một công cụ mạnh mẽ để khớp và điều chỉnh các chuỗi ký tự.

Các lớp Biểu thức Chính quy (Regex) trong Java

Java cung cấp một gói có tên java.util.regex chứa một số lớp để làm việc với biểu thức chính quy. Ba lớp chính mà chúng ta sẽ tập trung vào là:

  1. Pattern
  2. Matcher
  3. PatternSyntaxException

Hãy khám phá từng một trong những lớp này chi tiết.

Lớp Pattern

Lớp Pattern đại diện cho một biểu thức chính quy đã biên dịch. Hãy nghĩ về nó như bản kế hoạch cho công việc phát triển khớp mẫu của bạn.

import java.util.regex.Pattern;

public class PatternExample {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("Chào");
System.out.println("Pattern đã tạo: " + pattern);
}
}

Trong ví dụ này, chúng ta đang tạo một mẫu đơn giản khớp với từ "Chào". Phương thức compile() nhận biểu thức chính quy dưới dạng một chuỗi và trả về một đối tượng Pattern.

Lớp Matcher

Lớp Matcher là nơi mà những điều kỳ diệu thực sự diễn ra. Nó thực hiện các thao tác khớp trên một dãy ký tự dựa trên một Pattern.

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

public class MatcherExample {
public static void main(String[] args) {
String text = "Chào, Thế giới! Chào, Java!";
Pattern pattern = Pattern.compile("Chào");
Matcher matcher = pattern.matcher(text);

while (matcher.find()) {
System.out.println("Tìm thấy khớp ở chỉ số: " + matcher.start());
}
}
}

Mã này tìm kiếm mẫu "Chào" trong văn bản đã cho và in ra chỉ số đầu tiên của mỗi khớp. Đó giống như phát triển của chúng ta tìm thấy tất cả các xuất hiện của một gợi ý trong một tài liệu!

Cú pháp Biểu thức Chính quy

Bây giờ, hãy học một số cú pháp cơ bản để tạo ra các mẫu phức tạp hơn. Dưới đây là bảng các ký tự đặc biệt thường được sử dụng:

Ký tự đặc biệt Mô tả
. Khớp bất kỳ ký tự đơn nào
^ Khớp đầu dòng
$ Khớp cuối dòng
* Khớp không có hoặc nhiều lần
+ Khớp một hoặc nhiều lần
? Khớp không hoặc một lần
\d Khớp một chữ số
\s Khớp một ký tự khoảng trắng
\w Khớp một ký tự từ (chữ cái, chữ số hoặc dấu gạch dưới)

Hãy xem một số của chúng trong hành động:

public class RegexSyntaxExample {
public static void main(String[] args) {
String text = "The quick brown fox jumps over the lazy dog";

// Khớp từ bắt đầu bằng 'q'
Pattern pattern1 = Pattern.compile("\\bq\\w+");
Matcher matcher1 = pattern1.matcher(text);
if (matcher1.find()) {
System.out.println("Từ bắt đầu bằng 'q': " + matcher1.group());
}

// Khớp từ kết thúc bằng 'g'
Pattern pattern2 = Pattern.compile("\\w+g\\b");
Matcher matcher2 = pattern2.matcher(text);
if (matcher2.find()) {
System.out.println("Từ kết thúc bằng 'g': " + matcher2.group());
}
}
}

Trong ví dụ này, chúng ta sử dụng \b để khớp ranh giới từ, \w+ để khớp một hoặc nhiều ký tự từ, và kết hợp chúng với 'q' và 'g' để tìm từ bắt đầu bằng 'q' và kết thúc bằng 'g' tương ứng.

Nhóm Khớp trong Biểu thức Chính quy

Nhóm khớp cho phép bạn xử lý nhiều ký tự như một đơn vị duy nhất. Chúng được tạo ra bằng cách đặt các ký tự cần nhóm trong một cặp dấu ngoặc đơn.

public class CapturingGroupExample {
public static void main(String[] args) {
String text = "John Doe ([email protected])";
Pattern pattern = Pattern.compile("(\\w+)\\s(\\w+)\\s\\((\\w+@\\w+\\.\\w+)\\)");
Matcher matcher = pattern.matcher(text);

if (matcher.find()) {
System.out.println("Tên: " + matcher.group(1));
System.out.println("Họ: " + matcher.group(2));
System.out.println("Email: " + matcher.group(3));
}
}
}

Trong ví dụ này, chúng ta đang trích xuất tên, họ và địa chỉ email của một người từ một chuỗi. Các dấu ngoặc trong mẫu tạo ra các nhóm khớp, mà chúng ta có thể truy cập bằng cách sử dụng matcher.group(n).

Các Phương thức của Lớp Matcher

Lớp Matcher cung cấp một số phương thức hữu ích. Dưới đây là một số phương thức thường được sử dụng:

Phương thức Mô tả
find() Tìm khớp tiếp theo cho mẫu
group() Trả về chuỗi khớp
start() Trả về chỉ số đầu của khớp
end() Trả về chỉ số cuối của khớp
matches() Kiểm tra xem toàn bộ chuỗi có khớp với mẫu

Hãy xem các phương thức này trong hành động:

public class MatcherMethodsExample {
public static void main(String[] args) {
String text = "The rain in Spain falls mainly on the plain";
Pattern pattern = Pattern.compile("\\b\\w+ain\\b");
Matcher matcher = pattern.matcher(text);

while (matcher.find()) {
System.out.println("Tìm thấy: " + matcher.group());
System.out.println("Chỉ số đầu: " + matcher.start());
System.out.println("Chỉ số cuối: " + matcher.end());
}
}
}

Mã này tìm tất cả các từ kết thúc bằng "ain" và in ra mỗi khớp cùng với chỉ số đầu và cuối.

Các Phương thức Thay thế của Biểu thức Chính quy

Biểu thức chính quy không chỉ để tìm mẫu mà còn để thay thế văn bản. Lớp Matcher cung cấp các phương thức để thực hiện điều này:

public class ReplacementExample {
public static void main(String[] args) {
String text = "The quick brown fox jumps over the lazy dog";
Pattern pattern = Pattern.compile("fox|dog");
Matcher matcher = pattern.matcher(text);

String result = matcher.replaceAll("animal");
System.out.println("Sau khi thay thế: " + result);
}
}

Trong ví dụ này, chúng ta thay thế cả "fox" và "dog" bằng "animal". Phương thức replaceAll() làm tất cả công việc chăm chỉ cho chúng ta!

Lớp PatternSyntaxException

Đôi khi, chúng ta có thể gặp lỗi khi viết biểu thức chính quy. Đó là nơi lớp PatternSyntaxException đến từ. Nó được ném ra để chỉ ra một lỗi cú pháp trong biểu thức chính quy.

public class PatternSyntaxExceptionExample {
public static void main(String[] args) {
try {
Pattern.compile("[");  // Biểu thức chính quy không hợp lệ
} catch (PatternSyntaxException e) {
System.out.println("Lỗi cú pháp biểu thức chính quy: " + e.getMessage());
System.out.println("Chỉ số của lỗi: " + e.getIndex());
}
}
}

Mã này đột ngột sử dụng một biểu thức chính quy không hợp lệ để minh họa cách PatternSyntaxException hoạt động. Đó giống như có một trợ lý kiểm tra chính tả tính cho biểu thức chính quy của bạn!

Và thế là, các bạn đã học hết về Java Biểu thức Chính quy, từ mẫu cơ bản đến các thay thế phức tạp. Hãy nhớ, như bất kỳ công cụ mạnh mẽ nào, regex trở nên hữu ích hơn khi bạn thực hành nhiều hơn. Vì vậy đừng sợ thử nghiệm và tạo ra mẫu của riêng bạn. Ai biết? Bạn có thể trở thành Sherlock Holmes của việc khớp mẫu!

Chúc các bạn lập trình vui vẻ, và may mắn có những chuỗi khớp mong muốn của bạn!

Credits: Image by storyset