Biểu thức chính quy (Regular Expression) là chuỗi ký tự định nghĩa/hình thành một mẫu (pattern) để tìm kiếm trong văn bản đầu vào. Biểu thức chính quy có thể chứa một hoặc nhiều ký tự, dùng để tìm kiếm hoặc thay thế chuỗi.
Java cung cấp gói java.util.regex cho pattern matching với biểu thức chính quy. Gói này chứa 3 lớp chính:
- Pattern class: Lớp Pattern là biểu diễn đã biên dịch của regex. Cung cấp 2 phương thức:
compile(): Chấp nhận String regex, trả về Pattern object.matcher(): Chấp nhận String, tạo Matcher object khớp chuỗi với pattern.
- Matcher class: Engine thực hiện các phép khớp. Cần 2 phương thức:
find(): Trả về true nếu khớp thành công, ngược lại false.group(): Chấp nhận int (group index), trả về chuỗi bị bắt (captured) bởi group chỉ định.
- PatternSyntaxException: Exception unchecked chỉ ra lỗi cú pháp trong pattern regex.
Ví dụ 1: Loại bỏ ký tự non-ASCII
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
System.out.println("Nhập chuỗi đầu vào: ");
String input = sc.nextLine();
String regex = "[^\\p{ASCII}]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "");
}
matcher.appendTail(sb);
System.out.println("Kết quả:\n" + sb.toString());
}
}
Kết quả
Nhập chuỗi đầu vào: whÿ do we fall Kết quả: wh do we fall
Ví dụ 2: Tìm vị trí ký tự 't'
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StartExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Nhập văn bản: ");
String input = sc.nextLine();
String regex = "[t]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
int start = matcher.start();
System.out.println(start);
}
}
}
Kết quả
Nhập văn bản: Hello how are you welcome to Tutorialspoint 26 31 42