Sử dụng Pattern và Matcher

Một phần của tài liệu Tìm hiểu ngôn ngữ java và viết demo ứng dụng (Trang 31 - 36)

17 \S+ Một số ký tự không phải khoảng trắng (Một hoặc nhiều)

4.5Sử dụng Pattern và Matcher

1. Pattern là một đối tượng mẫu, một phiên bản biên dịch của biểu thức chắnh quy. Nó không có cấu tử public, và chúng ta sẽ sử dụng method tĩnh compile(String) để tạo đối tượng, với tham số là biểu thức chắnh quy.

2. Matcher là một phương tiện để khớp với String dữ liệu vào với đối tượng Pattern đã tạo trước đó. Class này không có cấu tử public, và chúng ta lấy đối tượng này thông qua method matcher(String) của đối tượng pattern. Với tham số String là văn bản cần kiểm tra.

3. PatternSyntaxException sẽ bị ném ra nếu biểu thức chắnh quy có ngữ pháp không chắnh xác.

String regex= ".xx.";

// Tạo đối tượng Pattern thông qua method tĩnh. Pattern pattern = Pattern.compile(regex); // Lấy ra đối tượng Matcher

boolean match = matcher.matches(); System.out.println("Match "+ match);

Class Patten:

public static Pattern compile(String regex, int flags) ; public static Pattern compile(String regex);

public Matcher matcher(CharSequence input);

public static boolean matches(String regex, CharSequence input);

Class Matcher:

public int start()

public int start(int group) public int end()

public int end(int group) public String group()

public String group(int group) public String group(String name) public int groupCount()

public boolean matches() public boolean lookingAt() public boolean find()

Đây là một vắ dụ sử dụng Matcher và method find() để tìm kiếm các chuỗi con khớp với biểu thức chắnh quy.

import java.util.regex.Matcher; import java.util.regex.Pattern; public class MatcherFind {

public static void main(String[] args) {

final String TEXT = "This \t is a \t\t\t String"; // Khoảng trắng xuất hiện 1 hoặc nhiều lần. String regex = "\\s+";

Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(TEXT); int i = 0;

while (matcher.find()) {

System.out.print("start" + i + " = " + matcher.start()); System.out.print(" end" + i + " = " + matcher.end()); System.out.println(" group" + i + " = " + matcher.group()); i++;

} } } }

import java.util.regex.Matcher; import java.util.regex.Pattern; public class MatcherLookingAt { public static void main(String[] args) { String country1 = "iran";

String country2 = "Iraq";

// Bắt đầu bởi I tiếp theo là ký tự bất kỳ. // Tiếp theo là ký tự a hoặc e.

String regex = "^I.[ae]";

Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(country1);

// lookingAt() tìm kiếm khớp phần đầu.

System.out.println("lookingAt = " + matcher.lookingAt()); // Trong khi matches() phải khớp toàn bộ (adsbygoogle = window.adsbygoogle || []).push({});

System.out.println("matches = " + matcher.matches()); // Reset matcher với text mới, country2

matcher.reset(country2); System.out.println("lookingAt = " + matcher.lookingAt()); System.out.println("matches = " + matcher.matches()); } } 4.6 Nhóm (Group)

Một biểu thức chắnh quy bạn có thể tách ra thành các nhóm (group):

// Một biểu thức chắnh quy String regex = "\\s+=\\d+"; // Viết dưới dạng group, bởi dấu () String regex2 = "(\\s+)(=)(\\d+)"; // Một cách khác.

Các group có thể lồng nhau, và như vậy cần một quy tắc đánh chỉ số các group. Toàn bộ pattern được định nghĩa là group số 0. Còn lại được mô tả giống hình minh họa dưới đây:

Chú ý: Sử dụng (?:pattern) để thông báo với Java không xem đây là một group (None- capturing group)

Từ Java 7, bạn có thể xác định một group có tên (?<name>pattern), Và bạn có thể truy cập các nội dung khớp với Matcher.group (String name). Điều này làm Regex dài hơn, nhưng mã này là có ý nghĩa hơn, dễ hơn.

Nhóm bắt theo tên cũng có thể được truy cập thông qua Matcher.group (int group) với các đề án đánh số tương tự.

Nội bộ, Java chỉ lập bản đồ từ tên đến số nhóm. Do đó, bạn không thể sử dụng cùng tên để bắt 2 nhóm khác nhau.

Hãy xem một vắ dụ sử dụng đánh tên cho nhóm (group) (Java >=7)

package org.o7planning.tutorial.regex; import java.util.regex.Matcher;

import java.util.regex.Pattern; public class NamedGroup {

public static void main(String[] args) {

final String TEXT = " int a = 100;float b= 130;float c= 110 ; ";

// Sử dụng (?<groupName>pattern) để định nghĩa một Group có tên: groupName // Định nghĩa group có tên declare: sử dụng (?<declare> ...)

// Và một group có tên value: sử dụng: (?<value> ..)

String regex = "(?<declare>\\s*(int|float)\\s+[a-z]\\s*)=(?<value>\\s*\\d+\\s*);"; Pattern pattern = Pattern.compile(regex);

Matcher matcher = pattern.matcher(TEXT); while (matcher.find()) {

String group = matcher.group(); System.out.println(group);

System.out.println("declare: " + matcher.group("declare")); System.out.println("value: " + matcher.group("value"));

System.out.println("---"); }

}} }

Kết quả chạy vắ dụ:

Để dễ hiểu bạn có thể xem hình minh họa dưới đây:

Một phần của tài liệu Tìm hiểu ngôn ngữ java và viết demo ứng dụng (Trang 31 - 36)