http://vietjack.com/java/index.jsp Copyright © vietjack.com Regular Expression Java Java cung cấp java.util.regex package cho pattern so khớp với Regular Expression Các Regular Expression Java tương tự với Ngơn ngữ lập trình Perl dễ dàng để học Một Regular Expression dãy liên tục ký tự đặc biệt mà giúp bạn so khớp tìm kiếm chuỗi tập hợp chuỗi khác, sử dụng cú pháp riêng biệt pattern Chúng sử dụng để tìm, chỉnh sửa thao tác text liệu Để hiểu sâu khái niệm trình bày chương này, mời bạn tham khảo loạt bài: Ví dụ Regular Expression Java Gói java.util.regex chủ yếu chứa lớp sau: Lớp Pattern: Một đối tượng Pattern phép biểu diễn biên dịch Regular Expression Lớp Pattern không cung cấp public constructor Để tạo pattern, bạn phải gọi phương thức biên dịch static chung nó, mà sau trả đối tượng Pattern Những phương thức chấp nhận Regular Expression tham số Lớp Matcher: Một đối tượng Matcher phương tiện mà thông dịch pattern thực so khớp hoạt động với chuỗi đầu vào Như lớp Pattern, Matcher không định nghĩa public constructor Bạn nhận đối tượng Matcher việc gọi phương thức matcher đối tượng Pattern PatternSyntaxException: Một đối tượng PatternSyntaxException exception (ngoại lệ) chưa kiểm tra mà dẫn lỗi cú pháp mẫu Regular Expression Capture Group Java Capturing Groups cách coi nhiều ký tự đơn vị đơn Chúng tạo việc xác định vị trí ký tự để nhóm vào tập hợp dấu ngoặc đơn Ví dụ, Regular Expression (dog) tạo group đơn chứa chữ “d”, “o” “g” Capturing Groups đánh số việc tính tốn số dấu ngoặc đơn mở từ trái qua phải Ví dụ, Expression ((A)(B(C))) có nhóm: ((A)(B(C))) http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/java/index.jsp (A) (B(C)) (C) Copyright © vietjack.com Để tìm group có mặt Expression đó, bạn gọi phương thức groupCount đối tượng Matcher Phương thức groupCount trả int minh họa số Capturing Groups có mặt mẫu đối tượng Matcher Cũng có group đặc biệt, group 0, mà ln ln biểu diễn tồn expression Group khơng bao gồm kết phương thức groupCount Ví dụ: Ví dụ sau minh họa cách để tìm chuỗi ký số từ chuỗi chữ-số cho: import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { public static void main( String args[] ){ // String to be scanned to find the pattern String line = "This order was placed for QT3000! OK?"; String pattern = "(.*)(\\d+)(.*)"; // Create a Pattern object Pattern r = Pattern.compile(pattern); // Now create matcher object Matcher m = r.matcher(line); if (m.find( )) { System.out.println("Found value: " + m.group(0) ); System.out.println("Found value: " + m.group(1) ); System.out.println("Found value: " + m.group(2) ); http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/java/index.jsp Copyright © vietjack.com } else { System.out.println("NO MATCH"); } } } Nó cho kết sau: Found value: This order was placed for QT3000! OK? Found value: This order was placed for QT300 Found value: Cú pháp cho Regular Expression Java Bảng liệt kê tất cú pháp siêu ký tự cho Regular Expression có sẵn Java Subexpression So khớp ^ So khớp với phần bắt đầu dòng (line) $ So khớp với phần cuối dòng So khớp với ký tự đơn ngoại trừ newline Sử dụng tùy chọn m cho phép so khớp với newline [ ] So khớp với ký tự đơn dấu ngoặc vuông [^ ] So khớp với ký tự đơn không dấu ngoặc vuông \A Phần bắt đầu chuỗi \z Phần cuối chuỗi http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/java/index.jsp Copyright © vietjack.com \Z Phần cuối chuỗi re* So khớp với nhiều xuất expression đặt trước re+ So khớp với nhiều trước re? So khớp với xuất expression đặt trước re{ n} So khớp cách xác với n lần xuất Expression đặt trước re{ n,} So khớp với n lần xuất nhiều Expression đặt trước re{ n, m} So khớp với n nhiều m lần xuất Expression đặt trước a| b So khớp với a b (re) Nhóm Regular Expression ghi nhớ text so khớp (?: re) Nhóm Regular Expression mà khơng ghi nhớ text so khớp (?> re) So khớp với patter độc lập mà khơng truy tích ngược (backtrack) \w So khớp với ký tự từ \W So khớp với ký tự từ \s So khớp với khoảng trống trắng Tương đương với [\t\n\r\f] \S So khớp với ký tự không khoảng trống trắng http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/java/index.jsp Copyright © vietjack.com \d So khớp với ký số Tương đương với [0-9] \D So khớp với ký tự không ký số \A So khớp với phần bắt đầu chuỗi \Z So khớp với phần kết thúc chuỗi Nếu newline tồn tại, so khớp với trước newline \z So khớp với phần kết thúc chuỗi \G So khớp với điểm, nơi mà so khớp cuối kết thúc \n Tham chiếu ngược để capture group số "n" \b So khớp với giới hạn từ bên dấu ngoặc vng So khớp với phím lùi (0x08) dấu ngoặc vuông \B So khớp giới hạn từ \n, \t, etc So khớp với newline, carriage return, tab, … \Q Thốt (trích dẫn) tất ký tự tới \E \E Kết thúc trích dẫn \Q Các phương thức lớp Matcher Java Dưới danh sách phương thức hữu ích: http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/java/index.jsp Copyright © vietjack.com Các phương thức Index Java Các phương thức index cung cấp giá trị mục hữu ích giúp tìm kiếm so khớp xác chuỗi đầu vào STT Phương thức Miêu tả public int start() Trả mục bắt đầu so khớp trước public int start(int group) Trả mục bắt đầu dãy phụ nắm bắt group cho hoạt động so khớp trước public int end() Trả offset sau ký tự cuối so khớp public int end(int group) Trả offset sau ký tự cuối dãy phụ nắm bắt group cho hoạt động so khớp trước Các phương thức Study Java Các phương thức Study duyệt lại chuỗi input trả Boolean có hay khơng pattern tìm thấy STT Phương thức Miêu tả public boolean lookingAt() So khớp với dãy input, khu vực đó, với pattern public boolean find() http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/java/index.jsp Copyright © vietjack.com Tìm dãy dãy input mà so khớp với pattern public boolean find(int start Đặt lại Matcher sau cố gắng tìm dãy dãy input mà so khớp với pattern, mục xác định public boolean matches() So khớp toàn khu vực với pattern Các phương thức thay vị trí Java Các phương thức hữu ích để thay text chuỗi input: STT Phương thức Miêu tả public Matcher appendReplacement(StringBuffer sb, String replacement) Triển khai bước phụ thêm-và-thay có giới hạn public StringBuffer appendTail(StringBuffer sb) Triển khai bước phụ thêm-và-thay không giới hạn public String replaceAll(String replacement) Thay dãy phụ dãy input mà so khớp pattern với chuỗi thay cho public String replaceFirst(String replacement) Thay dãy phụ dãy input mà so khớp pattern với chuỗi thay cho public static String quoteReplacement(String s) Trả String thay cho String xác định Phương thức tạo String mà làm việc thay literal phương thức appendReplacement http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/java/index.jsp Copyright © vietjack.com lớp Matcher Các phương thức start end Java Ví dụ đơn giản sau tính toán số lần mà từ “cats” xuất chuỗi input: import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static final String REGEX = "\\bcat\\b"; private static final String INPUT = "cat cat cat cattie cat"; public static void main( String args[] ){ Pattern p = Pattern.compile(REGEX); Matcher m = p.matcher(INPUT); // get a matcher object int count = 0; while(m.find()) { count++; System.out.println("Match number "+count); System.out.println("start(): "+m.start()); System.out.println("end(): "+m.end()); } } } Nó cho kết quả: Match number start(): end(): Match number http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/java/index.jsp Copyright © vietjack.com start(): end(): Match number start(): end(): 11 Match number start(): 19 end(): 22 Bạn thấy ví dụ sử dụng giới hạn từ để bảo đảm chữ “c” “a” “t” không đơn chuỗi phụ từ dài Nó cung cấp số thơng tin hữu ích nơi chuỗi input xuất so khớp Phương thức start trả mục bắt đầu dãy phụ nắm bắt group cho hoạt động so khớp trước, phương thức end trả mục ký tự cuối so khớp, cộng với Các phương thức matches lookingAt Java Cả hai phương thức matches lookingAt so khớp dãy input với pattern Tuy nhiên, sư khác phương thức matches yêu cầu toàn dãy input để so khớp, phương thức lookingAt khơng Cả hai phương thức ln ln bắt đầu điểm bắt đầu chuỗi input Dưới ví dụ giải thích tính này: import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static final String REGEX = "foo"; private static final String INPUT = "fooooooooooooooooo"; private static Pattern pattern; private static Matcher matcher; http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/java/index.jsp Copyright © vietjack.com public static void main( String args[] ){ pattern = Pattern.compile(REGEX); matcher = pattern.matcher(INPUT); System.out.println("Current REGEX is: "+REGEX); System.out.println("Current INPUT is: "+INPUT); System.out.println("lookingAt(): "+matcher.lookingAt()); System.out.println("matches(): "+matcher.matches()); } } Nó cho kết sau: Current REGEX is: foo Current INPUT is: fooooooooooooooooo lookingAt(): true matches(): false Các phương thức replaceFirst replaceAll Java Các phương thức replaceFirst replaceAll Java thay text mà so khớp với Regular Expression cho Như tên chúng cho biết, phương thức replaceFirst thay xuất so khớp đầu tiên, phương thức replaceAll thay tất so khớp Ví dụ sau giải thích tính này: import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static String REGEX = "dog"; private static String INPUT = "The dog says meow " + "All dogs say meow."; private static String REPLACE = "cat"; http://vietjack.com/ Trang chia sẻ học online miễn phí Page 10 http://vietjack.com/java/index.jsp Copyright © vietjack.com public static void main(String[] args) { Pattern p = Pattern.compile(REGEX); // get a matcher object Matcher m = p.matcher(INPUT); INPUT = m.replaceAll(REPLACE); System.out.println(INPUT); } } Nó cho kết sau: The cat says meow All cats say meow Các phương thức appendReplacement appendTailtrong Java Lớp Matcher cũng cung cấp hai phương thức appendReplacement appendTail để thay văn Ví dụ sau giải thích tính này: import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static String REGEX = "a*b"; private static String INPUT = "aabfooaabfooabfoob"; private static String REPLACE = "-"; public static void main(String[] args) { Pattern p = Pattern.compile(REGEX); // get a matcher object Matcher m = p.matcher(INPUT); StringBuffer sb = new StringBuffer(); while(m.find()){ http://vietjack.com/ Trang chia sẻ học online miễn phí Page 11 http://vietjack.com/java/index.jsp Copyright © vietjack.com m.appendReplacement(sb,REPLACE); } m.appendTail(sb); System.out.println(sb.toString()); } } Nó cho kết sau: -foo-foo-foo- Các phương thức lớp PatternSyntaxException Java Một lớp PatternSyntaxException exception chưa kiểm tra mà dẫn lỗi cú pháp (syntax error) mẫu Regular Expression Lớp PatternSyntaxException cung cấp phương thức sau để giúp bạn xác định gây lỗi STT Phương thức Miêu tả public String getDescription() Thu nhận miêu tả lỗi public int getIndex() Thu nhận mục lỗi public String getPattern() Thu nhận mẫu Regular Expression sai sót public String getMessage() Trả chuỗi nhiều dòng chứa mơ tả syntax error mục nó, mẫu Regular Expression sai sót, dẫn nhìn thấy mục lỗi pattern http://vietjack.com/ Trang chia sẻ học online miễn phí Page 12 http://vietjack.com/java/index.jsp Copyright © vietjack.com Để hiểu sâu khái niệm trình bày chương này, mời bạn tham khảo loạt bài: Ví dụ Regular Expression Java http://vietjack.com/ Trang chia sẻ học online miễn phí Page 13 ... order was placed for QT300 Found value: Cú pháp cho Regular Expression Java Bảng liệt kê tất cú pháp siêu ký tự cho Regular Expression có sẵn Java Subexpression So khớp ^ So khớp với phần bắt đầu... http://vietjack.com /java/ index.jsp Copyright © vietjack.com lớp Matcher Các phương thức start end Java Ví dụ đơn giản sau tính tốn số lần mà từ “cats” xuất chuỗi input: import java. util.regex.Matcher; import java. util.regex.Pattern;... Matcher Java Dưới danh sách phương thức hữu ích: http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com /java/ index.jsp Copyright © vietjack.com Các phương thức Index Java