Thường thì các ứng dụng java sẽ tìm kiếm sự xuất hiện của một ký tự hay một dấu hiệu token cụ thể nào đó trong một String, sau đó tìm 1 chuỗi bao nó và rồi kiểm tra tính hợp lệ của chuỗi
Trang 1GVHD:Phan Văn Sim Anh
Trang 2MỤC LỤC
1 Đặt vấn đề
2 Khái niệm Regular Expression là gì? Vai trò của nó?
3 API là gì? API của biểu thức chính quy?
4 Một số phương thức của lớp Pattern
5 Một số phương thức của lớp Matcher
6 Cú pháp mẫu
7 Ví dụ
Trang 3Thường thì các ứng dụng java sẽ tìm kiếm sự xuất hiện của một ký tự hay một dấu hiệu (token) cụ thể nào đó trong một String, sau đó tìm 1 chuỗi bao nó và rồi kiểm tra tính hợp lệ của chuỗi được tách ra.
Trang 4VD: Để xác định tính hợp lệ của một địa chỉ email, ta có thể kiểm tra sự xuất hiện của dấu ‘@’ và sau đó là một hay nhiều dấu ‘.’, việc đó có thể được thực hiện như sau:
1 Đặt vấn đề (tt)
Trang 6Kết quả của đoạn code này là: email hop le!
Vậy có cách nào ngắn hơn để giải quyết bài toán dạng này không?
Câu trả lời là: từ JDK 1.4 trở lên có hỗ trợ
regular expression trong gói Java.util.regex việc sử dụng gói này và các lớp hỗ trợ cho việc tìm kiếm
và thao tác trên chuỗi trở nên đơn giản hơn rất nhiều Nó giúp giảm bớt áp lực phải cố gắng và thêm đó là cải thiện đáng kề việc bảo trì
1 Đặt vấn đề (tt)
Trang 7a) Khái niệm Regular Expression:
Regular Expression hay còn gọi là biểu thức chính quy là một chuỗi miêu tả một bộ các chuỗi khác nhau, theo những quy tắc cú pháp nhất định
Hay nói cách khác Regular Expression là 1 cái khuôn được tạo ra để so khớp với 1 hay nhiều ký
tự đầu vào để kiểm tra tính hợp lệ của nó, tìm kiếm sự xuất hiện của nó trong chuỗi khác
2 Regular Expression
Regular Expression là gì, vai trò của nó trong các ứng dụng Java???
Trang 8b) Vai trò của Regular Expression (regex) trong các ứng dụng Java
- Phân tích cú pháp
- Xác định tính hợp lệ của dữ liệu
- Xử lý chuỗi
- Tách dữ liệu và tạo các báo cáo
Do đó việc nắm vững regex sẽ giúp bạn tiết kiệm thời gian và công sức trong việc thao tác và trích dẫn văn bản trên máy tính đặc biệt là trong các ứng dụng của Java
2 Regular Expression (tt)
Trang 9API là gì? API của biểu thức chính quy?
a) API ( A pplication P rogramming I nterface)
Là một giao diện mà một hệ thống máy tính hay ứng dụng cung cấp cho phép các yêu cầu dịch vụ có thể được tạo ra từ các chương trình máy tính khác, và/hoặc cho phép dữ liệu
có thể được trao đổi qua lại giữa chúng Chẳng hạn một chương trình máy tính có thể dùng các hàm API của hệ điều hành để xin cấp phát bộ nhớ và truy xuất tập tin
3 API
Trang 10Nhiều loại hệ thống và ứng dụng hiện thực API như các hệ thống đồ họa, cơ sỡ dữ liệu, dịch
vụ web
Đây là phần mềm hệ thống cung cấp đầy
đủ các chức năng và các tài nguyên mà các lập trình viên có thể lấy ra và từ đó tạo nên các tính năng giao tiếp người – máy: như các trình đơn kéo xuống, hộp thoại giúp tiết kiệm được nhiều thời gian
3 API (tt)
Trang 11b) API của biểu thức chính quy:
API của biểu thức chính quy trong ngôn ngữ Java gồm có ba lớp cốt lõi mà bạn sử dụng hầu như mọi lúc:
Pattern : mô tả một mẫu chuỗi nhất địnhMatcher : Kiểm tra một chuỗi ký tự xem nó
có khớp với mẫu ko?
PatternSyntaxException: để báo cho bạn biết rằng có một số thứ ko thể chấp nhận được với mẫu mà bạn đã thử định nghĩa
3 API (tt)
Trang 12a) Pattern.compile():
Biên dịch biểu thức trong Pattern
VD: Pattern pat = Pattern.compile(“cats.*dogs”);
Trang 13Cú pháp: static Pattern compile(String regex,
int flags)
VD: Pattern pattern =
pattern.compile(“.*http://.*”,CASE_INSENSITIVE);
Cờ được sử dụng ở trên làm cho pattern bỏ qua một số trường khi kết hợp văn bản
b) matches():
Kiểm tra chuỗi đầu vào có đúng với biểu thức trong pattern hay ko?
4 Pattern (tt)
Trang 14VD: String text = “this is the text to be
searched”+”forn occurrences of the pattern”;
Pattern pattern = Pattern.compile(“.*is.*”);
boolean matches =
Pattern.matches(pattern,text);
System.out.println(“matches = ”+matches);
Giải thích: ví dụ này tìm kiếm chuỗi ở trong
biến text cho sự xuất hiện của từ ‘is’, cho phép
ko hoặc nhiều ký tự trước và sau từ khóa,
4 Pattern (tt)
Trang 15d) Pattern.split():
Tách chuỗi thành các chuỗi nhỏ phương thức này có thể tách đoạn văn bản(chuỗi) thành những đoạn nhỏ vào cho mãng chuỗi, sử dụng
ký hiệu tách
4 Pattern (tt)
Trang 16VD:String text =“A sep text with sep many separator”; String patternString = “sep”;
Pattern pattern = pattern.compile(patternString);
String split = Patter.split(text);
Trang 17Giải thích: Ví dụ này sẽ tách đoạn văn bản trong biến
text thành 5 dãy strings riêng biệt và chúng sẽ được nạp vào mảng String
String pattern2 = Pattern.pattern();
Trong ví dụ này thì biến pattern2 sẽ chứa cả giá trị sep
4 Pattern (tt)
Trang 18=>Cụ thể: cố gắng tìm kiếm dãy đầu vào dựa trên
khuôn mẫu Method này chỉ thành công nếu toàn
bộ dãy ký tự đầu vào là giống nhau hoàn toàn.
5 Matcher
Một số phương thức cơ bản của lớp Matcher
Trang 19Cú Pháp:boolean matches = matcher.matches();
Pattern pat= Pattern.compile(“cats.*dogs”);
Matcher matcher = pat.matcher(“cats and dogs”);
boolean flag = Matcher.matches();//true
Pattern pat2 = Pattern.compile(“house.+family”);
Matcher matcher2 = pat2.matcher(“housefamily”);
boolean flag2 = matcher2.matches();//false
}
}
5 Matcher (tt)
Trang 20Chú ý: bạn ko thể sử dụng phương thức này để tìm
kiếm 1 biểu thức chính quy xuất hiện nhiều lần trong 1 text.Để làm điều này bạn có cần sử dụng phương thức find() ,end()
5 Matcher (tt)
Trang 21d) Phương thức find()
Tìm kiếm 1 phầnThử tìm kiếm chuỗi tiếp theo của chuỗi đầu vào phù hợp vời chuỗi mẫu, phương thức này bắt đầu từ đầu chuỗi đầu vào hoặc tiếp nối
ở vị trí tìm kiếm tiếp theo sau một kết quả tìm kiếm thành công
find() đặc biệt hữu dụng khi bạn quan tâm đến tất cả các chuỗi con trong chuỗi đầu vào phù hợp với khuôn mẫu được cung cấp
5 Matcher (tt)
Trang 22VD:Pattern pat = Pattern.compile(“john”);
Matcher matcher = pat.matcher(“Hello,I am john parker”);
Boolean flag = matcher.find();//true
Boolean flag2 = matcher.matches();//false
Pattern pat2 = Pattern.compile(“john”);
Matcher matcher3 = pat2.matcher(“john parker is my name”); boolean flag3 = matches.lookingAt();//true
boolean flag4 = matches.matches();//false vì ko được có thêm
ký tự trước và sau biểu thức
5 Matcher (tt)
Trang 23e) Phương thức Start() và end()
Trả về chỉ số đầu và cuối của biểu thức chính quy trong 1 đoạn khi được tìm thấy, nó thường kết hợp với hàm find() tìm chuỗi con trong chuỗi cha và muốn xuất ra vị trí đầu và vị trí cuối.
5 Matcher (tt)
Trang 24VD: String text = “this is the text which is to be
seareched”+”for occurrences of the the word”;
String patternString = “is”;
Pattern pattern = pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
}
5 Matcher (tt)
Trang 26Một mẫu (pattern) biểu thức chính quy mô
tả cấu trúc của chuỗi ký tự mà một biểu thức sẽ
cố gắng tìm kiếm trong một chuỗi ký tự đầu vào
Sau đây là một số các cấu kiện mẫu phổ biến mà bạn có thể sử dụng trong các chuỗi ký
tự mẫu
6 Cú pháp mẫu
Trang 27Construct Matches
x Tất cả các ký tự đều có thể sử dụng tại vị trí của x
\ Dấu gạch chéo này khi kết hợp với các ký tự thông thường tạo ký
hiệu đặc biệt
\0n Các ký tự với các giá trị hệ bát phân , n phải có giá trị từ 0-7
\xhh Ký tự với các giá trị hệ thập lục phân 0xhh
Trang 28b) Character classes
Construct Matches
[abc] So khớp với a, hoặc b, hoặc c
[^abc] So khớp với bất kỳ ký tự nào ngoài trừ a,b và c
[a-zA-Z] So khớp với bất kỳ ký tự nào từ a-z hoặc A-Z bao gồm cả
a,A,z,Z [ad[mp]] Đây là phép hội , so khớp với bất kỳ các ký tự nào từ a-d
hoặc m-p [az&&[def]] Đây là phép giao, giữa az với các ký tự def
[az&&[^bc]] So khớp với tất cả các ký tự từ a-z ngoại trừ b và c
6 Cú pháp mẫu (tt)
Trang 29c) Predefined Character Classes
Construct Matches
Bất kỳ ký tự đơn nào
? Xác định có 1 hoặc ko có ký tự hoặc biểu thức con đứng trước
nó ví dụ:A?B so trùng với B hoặc AB nhưng ko được ABB
* Xác Định ko có hoặc có nhiều biểu thức con đứng trước nó
vd:A*B
So trùng với B,AB,…
+ Xác định có một hay nhiều ký tự hay biểu thức con đứng trước
nó ví dụ A+B so trùng với AB,ABB,ABBB,… nhưng ko được trùng với B
Trang 30| Ngăn cách các biểu thức có thể so trùng, ví dụ AAA|ABA|ABB
sẽ so trùng với AAA,ABA hoặc ABB ( ) Xác định một biểu thức con sao cho nó được xem như một yếu
tố đơn lẻ đối với các yếu tố được trình bày trong bảng này
{n} Xác định có đúng n ký tự hoặc biểu thức con đứng trước nó,ví
du A{2} thì chỉ so trùng với AA {n,m} Xác định có n đến m ký tự đứng trước nó ví dụ: A{2,4} so trùng
với AA,AAA,AAAA nhưng ko được với A,AAAAA {n,} Xác định có ít nhất n ký tự hoặc biểu thức con đứng trước
nó,vd: A{a,} so trùng với AA,AAA,AAAA… nhưng ko được với A
6 Cú pháp mẫu (tt)
Trang 31d) Logical Operators
Construct Matches
X|Y X or Y(phép or)
6 Cú pháp mẫu (tt)
Trang 32a) Kiểm tra xem chuỗi nhập vào có phải là số điện thoại ko?
package kiemtrasodienthoai;
import java.util.regex.*;
public class so_dien_thoai {
public static void main(String[] args) {
Trang 34Phân tích yêu cầu bài toán và xây dựng khuôn mẫu:
- Số điện thoại thì có từ 10 đến 11 số
- Vậy đầu một chuỗi(ở đây là dãy số điện thoại) phải có ký hiệu bắt đầu(ký hiệu’^’)
- Sau đó phải bắt buộc phải là ký số(‘\\d’)
- Và ký số này nằm trong khoảng 10 đến 11 ký số(‘{10,11}’)
- Và ngay sau đó bắt buộc kết thúc chuỗi(‘$’)
7 Ví dụ (tt)
Trang 35=>cú pháp mẫu là:
"^\\d{10,11}$“;
Kết quả của bài toán:
0h1654507j6 ko phai la so dien thoai hihi!
01654507760 la so dien thoai
b) Kiểm tra chuỗi nhập vào có phải là địa chỉ email ko?
7 Ví dụ (tt)
Trang 36package Email;
import java.util.Scanner;
import java.util.regex.*;
import java.io.*;
public class Email {
public static void main(String[] args)throws Exception {
Scanner scanner = new Scanner(System.in);
System.out.println("nhap vao 1 chuoi:");
String str1 = scanner.nextLine();
String emailPattern = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-] +)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*((.)[a-z]{2,3})$";
7 Ví dụ (tt)
Trang 38VD:nhập vào dangquanghai150289@gmail.com
Kết quả là : dangquanghai@gmail.com la email
Nếu nhập vào: dangquanghai@ gmail.com ko phai
la dia chi email
7 Ví dụ (tt)
THANKS!!!