Java regex (Regular Expressions) là một công cụ mạnh mẽ cho việc xử lý chuỗi trong Java, nó cho phép bạn tạo các mẫu chuỗi linh hoạt để tìm kiếm, so khớp và thay thế các phần tử trong chuỗi.
Gói java.util.regex cung cấp ba lớp chính để làm việc với biểu thức chính quy:
| Lớp | Mô tả |
|---|---|
| Pattern | Được sử dụng để biểu diễn một mẫu regex. |
| Matcher | Được sử dụng để thực hiện so khớp mẫu regex với các chuỗi đầu vào. |
| PatternSyntaxException | Ném ra ngoại lệ khi có lỗi cú pháp trong biểu thức chính quy. |
Lớp Pattern được sử dụng để biểu diễn một mẫu regex. Một mẫu regex là một chuỗi các ký tự đặc biệt được sử dụng để tìm kiếm và so khớp với các chuỗi khác.
Lớp Pattern cung cấp các phương thức để tạo và quản lý các mẫu regex, cũng như tạo ra các đối tượng Matcher để áp dụng mẫu vào các chuỗi cụ thể.
| Bước | Mô tả |
|---|---|
| 1. Tạo mẫu Regex | Bạn có thể tạo một đối tượng Pattern bằng cách sử dụng phương thức tĩnh compile() và truyền một chuỗi biểu diễn mẫu regex như là đối số. |
Ví dụ: Pattern pattern = Pattern.compile("[a-zA-Z]+"); | |
| 2. So khớp mẫu | Lớp Pattern cung cấp phương thức matcher() để tạo một đối tượng Matcher từ mẫu đã tạo. Đối tượng Matcher sau đó được sử dụng để so khớp mẫu với các chuỗi. |
Matcher matcher = pattern.matcher("Hello World"); | |
| Đoạn mã trên tạo một đối tượng Matcher từ mẫu đã tạo và áp dụng nó vào chuỗi "Hello World". | |
| 3. Caching của Pattern | Java tự động lưu trữ và sử dụng lại các đối tượng Pattern đã được tạo trước đó để tối ưu hóa hiệu suất. |
| Điều này giúp tránh việc tạo một đối tượng Pattern mới nếu cùng một mẫu regex đã được sử dụng trước đó. |
Pattern :
| Phương thức | Mô tả |
|---|---|
| compile(String regex) | Biên dịch một biểu thức chính quy thành một đối tượng Pattern. Trả về một đối tượng Pattern đại diện cho mẫu regex đã biên dịch. |
| matches(String regex, CharSequence input) | Kiểm tra xem chuỗi đầu vào có khớp với mẫu regex đã chỉ định không. Trả về true nếu có sự khớp hoàn toàn, ngược lại trả về false. |
| matcher(CharSequence input) | Tạo một đối tượng Matcher từ chuỗi đầu vào, sẵn sàng để thực hiện so khớp với mẫu regex. Trả về một đối tượng Matcher. |
| split(CharSequence input) | Phân tách chuỗi đầu vào thành một mảng các chuỗi, sử dụng mẫu regex để xác định vị trí cắt. Trả về mảng các chuỗi đã được phân tách. |
| pattern() | Trả về biểu thức chính quy đã được biên dịch dưới dạng một chuỗi. |
| flags() | Trả về các cờ đã được sử dụng khi biên dịch mẫu regex. |
2. Lớp MatcherLớp Matcher được sử dụng để thực hiện so khớp mẫu regex với các chuỗi đầu vào.
Sau khi bạn đã tạo một mẫu regex bằng lớp Pattern, bạn có thể sử dụng lớp Matcher để áp dụng mẫu này vào các chuỗi cụ thể và thực hiện các thao tác như tìm kiếm, so khớp, và trích xuất thông tin từ các chuỗi này.
Bước Mô tả 1. Tạo đối tượng Matcher Bạn có thể tạo một đối tượng Matcher bằng cách sử dụng phương thức matcher() của lớp Pattern và truyền một chuỗi cần so khớp như đối số. Matcher matcher = pattern.matcher("Hello World");Đoạn mã trên tạo một đối tượng Matcher từ mẫu đã tạo và áp dụng nó vào chuỗi "Hello World". 2. Tìm kiếm và so khớp Lớp Matcher cung cấp các phương thức như find(), matches() để tìm kiếm và so khớp mẫu regex với chuỗi đầu vào. - find()sẽ tìm kiếm bất kỳ mẫu nào trong chuỗi.- matches()sẽ so khớp toàn bộ chuỗi.3. Trích xuất thông tin Bạn có thể sử dụng các phương thức như group() và start() để trích xuất thông tin từ chuỗi khớp. - group()sẽ trả về phần chuỗi khớp.- start()sẽ trả về vị trí bắt đầu của chuỗi khớp trong chuỗi đầu vào.4. Lặp lại việc so khớp Bạn có thể sử dụng một vòng lặp để liên tục tìm kiếm và trích xuất thông tin từ các chuỗi khớp liên tiếp. Điều này cho phép bạn tìm kiếm và xử lý nhiều mẫu regex. Điều này cho phép bạn tìm kiếm và xử lý nhiều mẫu regex trong cùng một chuỗi. 5. Tùy chọn trong việc so khớp Bạn có thể sử dụng các phương thức như lookingAt() để chỉ kiểm tra xem mẫu regex có khớp với phần đầu của chuỗi không mà không cần phải so khớp toàn bộ chuỗi. Điều này hữu ích khi bạn muốn kiểm tra xem một chuỗi có bắt đầu bằng một mẫu cụ thể không.
Matcher :| Phương thức | Mô tả |
|---|---|
| find() | Tìm và trả về true nếu chuỗi đầu vào chứa một phần của chuỗi khớp với biểu thức chính quy. |
| matches() | Kiểm tra xem toàn bộ chuỗi đầu vào có khớp với biểu thức chính quy không. |
| group() | Trả về phần chuỗi khớp với biểu thức chính quy trong chuỗi đầu vào. |
| start() | Trả về vị trí bắt đầu của phần khớp trong chuỗi đầu vào. |
| end() | Trả về vị trí kết thúc của phần khớp trong chuỗi đầu vào. |
| reset() | Đặt lại trạng thái của đối tượng Matcher để bắt đầu tìm kiếm từ đầu của chuỗi đầu vào. |
| replaceAll(String replacement) | Thay thế tất cả các chuỗi khớp với biểu thức chính quy trong chuỗi đầu vào bằng chuỗi thay thế đã cho. |
| replaceFirst(String replacement) | Thay thế chuỗi khớp đầu tiên với biểu thức chính quy trong chuỗi đầu vào bằng chuỗi thay thế đã cho. |
| matches(int group) | Kiểm tra xem chuỗi khớp với mẫu của nhóm đã chỉ định hay không. |
| groupCount() | Trả về số lượng nhóm khớp trong biểu thức chính quy |
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PhoneNumberValidator {
public static void main(String[] args) {
// Chuỗi đầu vào
String phoneNumber = "+1234567890";
// Mẫu regex cho số điện thoại có thể bắt đầu bằng dấu "+" và theo sau là 10 chữ số
String regex = "^\\+\\d{10}$";
// Biên dịch mẫu regex thành một đối tượng Pattern
Pattern pattern = Pattern.compile(regex);
// Tạo một đối tượng Matcher từ chuỗi đầu vào và mẫu regex
Matcher matcher = pattern.matcher(phoneNumber);
// Kiểm tra xem chuỗi đầu vào có khớp với mẫu regex không
if (matcher.matches()) {
System.out.println("Số điện thoại hợp lệ.");
} else {
System.out.println("Số điện thoại không hợp lệ.");
}
}
}3. Cú pháp Regex
Dưới đây là bảng cú pháp regex và các ví dụ tương ứng:
- Các lớp ký tự Regex:
| Regex | Mô tả | Pattern | Ví dụ |
|---|---|---|---|
[...] | Trả về một ký tự phù hợp | [abc] | a, b, c |
[^...] | Bất kỳ ký tự nào ngoại trừ | [^abc] | Không a, b, c |
[a-zA-Z] | a tới z hoặc A tới Z | [a-zA-Z] | a, b, A, B, ... |
[a-d[m-p]] | a tới d, hoặc m tới p | [a-d[m-p]] | a, b, c, m, n, o, p |
[a-z&&[def]] | d, e, hoặc f | [a-z&&[def]] | d, e, f |
[a-z&&[^bc]] | a tới z, ngoại trừ b và c | [a-z&&[^bc]] | a, d, e, ... |
[a-z&&[^m-p]] | a tới z, ngoại trừ m tới p | [a-z&&[^m-p]] | a, b, ..., l, q, ..., z |
[0-9] | 0 tới 9 | [0-9] | 0, 1, ..., 9 |
- Số lượng ký tự trong Regex:
| Regex | Mô tả | Pattern | Ví dụ |
|---|---|---|---|
| X? | X xảy ra một hoặc không lần | hellos? | hello, hellos, helloss |
| X+ | X xảy ra một hoặc nhiều lần | Version \w-\w+ | Version A-b1_1 |
| X* | X xảy ra không hoặc nhiều lần | A*B*C* | AAACC |
| X{n} | X chỉ xảy ra n lần | \d{4} | 2018, 20189, 201 |
| X{n,} | X xảy ra n hoặc nhiều lần | \d{4,} | 2018, 20189, 201 |
| X{y,z} | X xảy ra ít nhất y lần nhưng nhỏ hơn z lần | \d{2,3} | 2018, 201 |
- Ký tự đặc biệt trong Regex:
| Regex | Mô tả |
|---|---|
| . | Bất kỳ ký tự nào |
| ^ | Đánh dấu bắt đầu của một dòng, một chuỗi. Nếu sử dụng trong dấu [], nó có nghĩa là phủ định. |
| $ | Đánh dấu kết thúc của một dòng |
| \d | Bất kỳ chữ số nào, tương đương với [0-9] |
| \D | Bất kỳ ký tự nào không phải chữ số, tương đương với [^0-9] |
| \s | Bất kỳ ký tự trống nào (như dấu cách, tab, xuống dòng, ...), tương đương với [\t\n\x0B\f\r] |
| \S | Bất kỳ ký tự trống nào không phải ký tự trống, tương đương với [^\s] |
| \w | Bất kỳ ký tự chữ nào (chữ cái và chữ số), tương đương với [a-zA-Z_0-9] |
| \W | Bất kỳ ký tự nào không phải chữ cái và chữ số, tương đương với [^\w] |
| \b | Ranh giới của một từ |
| \B | Không phải ranh giới của một từ |
- Ký tự logic trong Regex:
| Regex | Mô tả | Pattern | Ví dụ |
|---|---|---|---|
| | | Hoặc | 22|33 | 33 |
| ( ... ) | Group các ký tự và chụp lại | A(nt|pple) | Ant, Apple |
| \1 | Nội dung của Group 1 | r(\w)g\1x | regex |
| \2 | Nội dung của Group 2 | (\d\d)\+(\d\d)=\2\+\1 | 12+65=65+12 |
| (?: ...) | Group không được chụp lại, không thể sử dụng \1 | A(?:nt|pple) | Ant, Apple |
Dưới đây là 1 số ví dụ sử dụng Regex trong Java :
Tìm ngày tháng năm (dd/mm/yyyy hoặc dd-mm-yyyy):
String dateRegex = "\\b\\d{1,2}[-/]\\d{1,2}[-/]\\d{4}\\b";Trong đó:
\d{1,2}: Đại diện cho một số có 1 hoặc 2 chữ số (ngày và tháng).[-|/]: Đại diện cho ký tự - hoặc /.\d{4}: Đại diện cho một số có 4 chữ số (năm).
Tìm email:
String emailRegex = "\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b";Tìm số điện thoại (có hoặc không có dấu cách):
String phoneRegex = "(\\d{3}[-\\s]?\\d{3}[-\\s]?\\d{4})|(\\(\\d{3}\\)[-\\s]?\\d{3}[-\\s]?\\d{4})";Tìm URL:
String urlRegex = "(http|https)://(www\\.)?\\w+\\.(com|org|net)";Tìm các từ bắt đầu bằng chữ in hoa:
String capitalizedWordRegex = "\\b[A-Z]\\w*\\b";

Không có nhận xét nào:
Đăng nhận xét