seminar tìm hiểu regular expression trong java

38
TÌM HIỂU REGULAR EXPRESSION TRONG JAVA Thành viên nhóm : 1.Đặng Quang Hải: 081246T 2.Nguyễn Hoàng Dũng: 081238T GVHD :Phan Văn Sim Anh

Upload: hoanghai150289

Post on 04-Aug-2015

663 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: Seminar Tìm Hiểu Regular Expression Trong Java

TÌM HIỂUREGULAR

EXPRESSION TRONG JAVA

Thành viên nhóm:1.Đặng Quang Hải: 081246T2.Nguyễn Hoàng Dũng: 081238T

GVHD:Phan Văn Sim Anh

Page 2: Seminar Tìm Hiểu Regular Expression Trong Java

MỤ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 Pattern5. Một số phương thức của lớp Matcher6. Cú pháp mẫu7. Ví dụ

Page 3: Seminar Tìm Hiểu Regular Expression Trong Java

1. Đặt vấn đề

Trong các ứng dụng java cần thực hiện và thao tác với các chuỗi, các lớp StringTokenizer và String được sử dụng rất nhiều, việc này làm phức tạp code và trở thành cơn ác mộng đối với việc bảo trì.

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 được tách ra.

Page 4: Seminar Tìm Hiểu Regular Expression Trong Java

VD: Để 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)

Page 5: Seminar Tìm Hiểu Regular Expression Trong Java

String str = [email protected];int indexofAtchar = str.indexof(“@”);if(indexofAtchar > 0){int indexofDotchar = str.indexof(“.”,indexofAtchar);if(indexofDotchar > 0){

system.out.println(“email hop le!”);}else

System.out.println(“email ko hop le”+”ko tim thay ‘.’ sau ‘@’”);

elseSystem.out.println(“email ko hop le ”+”ko tim thay ky tu ‘@’”);

1. Đặt vấn đề (tt)

Page 6: Seminar Tìm Hiểu Regular Expression Trong Java

Kế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)

Page 7: Seminar Tìm Hiểu Regular Expression Trong Java

a) 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???

Page 8: Seminar Tìm Hiểu Regular Expression Trong Java

b) 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)

Page 9: Seminar Tìm Hiểu Regular Expression Trong Java

API là gì? API của biểu thức chính quy?

a) API (Application Programming Interface)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

Page 10: Seminar Tìm Hiểu Regular Expression Trong Java

Nhiề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)

Page 11: Seminar Tìm Hiểu Regular Expression Trong Java

b) 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)

Page 12: Seminar Tìm Hiểu Regular Expression Trong Java

a) Pattern.compile():Biên dịch biểu thức trong Pattern

VD: Pattern pat = Pattern.compile(“cats.*dogs”); Matcher matcher = pat.matcher(“cats and dogs”); boolean flag = matcher.matches();

Chú ý: chúng ta cũng có thể biên dịch pattern sử dụng các cờ đặc biệt.

4. PatternMột số phương thức cơ bản của lớp Pattern

Page 13: Seminar Tìm Hiểu Regular Expression Trong Java

Cú 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)

Page 14: Seminar Tìm Hiểu Regular Expression Trong Java

VD: 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)

Page 15: Seminar Tìm Hiểu Regular Expression Trong Java

c) pattern.matcher();Tạo ra một đối tượng thuộc lớp Matcher

từ lớp patternVD: Matcher matcher = Pattern.matcher(text);

Lớp Matcher dùng để thực hiện những việc như kiểm tra và tìm kiếm

d) 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)

Page 16: Seminar Tìm Hiểu Regular Expression Trong Java

VD:String text =“A sep text with sep many separator”;

String patternString = “sep”;Pattern pattern =

pattern.compile(patternString);String split = Patter.split(text);System.out.println(“split.lenght”+split.lenght);for(String element : Split){

System.out.println(“element = ”+element);}

4. Pattern (tt)

Page 17: Seminar Tìm Hiểu Regular Expression Trong Java

Giả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

e) pattern.pattern()Phương thức này chỉ đơn giản trả về một

pattern khi pattern được biên dịchVD:String patternString = “sep”; Pattern pattern =

Pattern.compile(patternString); String pattern2 = Pattern.pattern();

Trong ví dụ này thì biến pattern2 sẽ chứa cả giá trị sep

4. Pattern (tt)

Page 18: Seminar Tìm Hiểu Regular Expression Trong Java

a) Tạo một Matcher();Việc tạo ra một Matcher được thực hiện

bởi phương thức matcher() của lớp PatternVD:Matcher matcher = Pattern.matcher(text);

b) Phương thức matches();Lớp Matcher cung cấp phương thức

matches() để kiểm tra sự giống nhau chính xác.=>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. MatcherMột số phương thức cơ bản của lớp Matcher

Page 19: Seminar Tìm Hiểu Regular Expression Trong Java

Cú Pháp:boolean matches = matcher.matches();VD:import java.util.regex;import Java.until.*;Public class exactmatch{

public static void main(String args[]){

Pattern pat= Pattern.compile(“cats.*dogs”);Matcher matcher = pat.matcher(“cats and dogs”);boolean flag = Matcher.matches();//truePattern pat2 = Pattern.compile(“house.+family”);Matcher matcher2 = pat2.matcher(“housefamily”);boolean flag2 = matcher2.matches();//false

}}

5. Matcher (tt)

Page 20: Seminar Tìm Hiểu Regular Expression Trong Java

Chú ý: 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()

c) Phương thức lookingAt()Tìm kiếm 1 phần

Cú Pháp: boolean lookingAt();Thử tìm kiếm chuỗi đầu vào, bắt đầu dựa

trên khuôn mẫu. Giống như phương thức matches(), phương thức luôn bắt đầu từ đầu của chuỗi đầu vào nhưng ko giống như phương thức matches() nó ko đòi hỏi toàn bộ chuỗi đầu vào phải giống.

5. Matcher (tt)

Page 21: Seminar Tìm Hiểu Regular Expression Trong Java

d) 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)

Page 22: Seminar Tìm Hiểu Regular Expression Trong Java

VD:Pattern pat = Pattern.compile(“john”);Matcher matcher = pat.matcher(“Hello,I am

john parker”);Boolean flag = matcher.find();//trueBoolean flag2 = matcher.matches();//falsePattern pat2 = Pattern.compile(“john”);Matcher matcher3 = pat2.matcher(“john parker

is my name”);boolean flag3 = matches.lookingAt();//trueboolean flag4 = matches.matches();//false vì ko

được có thêm ký tự trước và sau biểu thức

5. Matcher (tt)

Page 23: Seminar Tìm Hiểu Regular Expression Trong Java

e) 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)

Page 24: Seminar Tìm Hiểu Regular Expression Trong Java

VD: 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);Int count = 0;While(matcher.find()){

count ++;System.out.println(“found:”+count+”:”+matcher.Start()

+”-”+matcher.end());}

5. Matcher (tt)

Page 25: Seminar Tìm Hiểu Regular Expression Trong Java

Kết quả:found 1: 1:2 – 4found 2: 2:5- 7Found 3:23 – 25found 4:70 – 72

5. Matcher (tt)

Page 26: Seminar Tìm Hiểu Regular Expression Trong Java

Mộ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

Page 27: Seminar Tìm Hiểu Regular Expression Trong Java

Construct

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

\t Ký tự tab

\n Ký tự xuống dòng

\r Ký tự về đầu dòng

\f Ký tự qua trang

6. Cú pháp mẫu (tt)

a) chacracter:

Page 28: Seminar Tìm Hiểu Regular Expression Trong Java

b) 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)

Page 29: Seminar Tìm Hiểu Regular Expression Trong Java

c) 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*BSo 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

[] Một dãy ký tự hay chữ số

[^] Phép phủ định

\d Ký tự chữ số thập phân

\w Ký tự word bất kỳ ký tự nào bao gồm số hay ký tự

\W Ko có bất kỳ ký tự nào

6. Cú pháp mẫu (tt)

Page 30: Seminar Tìm Hiểu Regular Expression Trong Java

\D Ko phải là số

\s Bất kỳ các ký tự khoảng trống nào(\n,\t,\r…)

\S Ko có bất kỳ khoảng trống nào

^ Bắt đầu 1 chuỗi hay một dòng

$ Kết thúc một chuỗi hay một dòng

\A Bắt đầu một chuỗi

\z Kết thúc một chuỗi

| 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)

Page 31: Seminar Tìm Hiểu Regular Expression Trong Java

d) Logical Operators

Construct Matches

XY X and Y(phép and)

X|Y X or Y(phép or)

6. Cú pháp mẫu (tt)

Page 32: Seminar Tìm Hiểu Regular Expression Trong Java

a) 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) {

String str = " 0h1654507j6";String str2 = "01654507760";String pattern = "^\\d{10,11}$";

boolean result = str.matches(pattern);

7. Ví dụ

Page 33: Seminar Tìm Hiểu Regular Expression Trong Java

if(result == true)System.out.println(str + " la so dien thoai");

else System.out.println(str + " ko phai la so dien thoai hihi!");

result = str2.matches(pattern);if(result == true)

System.out.println(str2 + " la so dien thoai ");else

System.out.println(str2 + " ko phai la so dien thoai hihi !");

}}

7. Ví dụ (tt)

Page 34: Seminar Tìm Hiểu Regular Expression Trong Java

Phâ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)

Page 35: Seminar Tìm Hiểu Regular Expression Trong Java

=>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)

Page 36: Seminar Tìm Hiểu Regular Expression Trong Java

package 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)

Page 37: Seminar Tìm Hiểu Regular Expression Trong Java

boolean isMatch = Pattern.matches(emailPattern, str1);if(isMatch==true)

System.out.println(str1+" la email");else

System.out.println(str1+" ko phai la dia chi email!");}}

7. Ví dụ (tt)

Page 38: Seminar Tìm Hiểu Regular Expression Trong Java

VD:nhập vào [email protected]ết quả là : [email protected] la emailNếu nhập vào: dangquanghai@ gmail.com ko

phai la dia chi email

7. Ví dụ (tt)

THANKS!!!