Java: Nhóm thu thập

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Trong phần trước, chúng ta đã biết cách gắn bộ định lượng vào một ký tự, lớp ký tự hoặc nhóm thu thập tại một thời điểm. Nhưng cho đến giờ ta vẫn chưa thảo luận về khái niệm nhóm thu thập một cách chi tiết.

 Nhóm thu thập là một cách để coi nhiều ký tự như một đơn vị duy nhất. Chúng được tạo ra bằng cách đặt các ký tự được nhóm bên trong một tập hợp các dấu ngoặc đơn. Ví dụ: biểu thức chính quy (dog) tạo một nhóm duy nhất chứa các chữ cái "d" "o" và "g". Phần của chuỗi đầu vào phù hợp với nhóm thu thập sẽ được lưu trong bộ nhớ để gọi lại sau này thông qua backreferences (như được thảo luận bên dưới trong phần Tham chiếu ngược).

Đánh số

Như được mô tả trong API Pattern, các nhóm thu thập được đánh số bằng cách đếm các dấu ngoặc đơn mở của chúng từ trái sang phải. Ví dụ: trong biểu thức ((A) (B (C))), có bốn nhóm như sau:

  1. ((A)(B(C)))
  2. (A)
  3. (B(C))
  4. (C)

Để biết có bao nhiêu nhóm hiện diện trong biểu thức, hãy gọi phương thức groupCount() trên một đối tượng so khớp. Phương thức groupCount() trả về một giá trị int hiển thị số lượng nhóm thu thập có trong mẫu của trình so khớp. Trong ví dụ này, groupCount() sẽ trả về số 4, cho thấy rằng mẫu có 4 nhóm thu thập.

Ngoài ra còn có một nhóm đặc biệt, nhóm 0, luôn đại diện cho toàn bộ biểu thức. Nhóm này không được tính đến bởi groupCount(). Các nhóm bắt đầu bằng (? là các nhóm thuần túy, không thu thập, không ghi lại văn bản và không được tính vào tổng của nhóm. (Bạn sẽ thấy các ví dụ về nhóm không thu thập sau trong phần Các phương pháp của lớp Pattern).

Điều quan trọng là phải hiểu cách đánh số nhóm vì một số phương thức Matcher chấp nhận một chỉ định int một số nhóm cụ thể làm tham số:

  • public int start(int group): Trả về chỉ mục bắt đầu của dãy con được nhóm đã cho nắm bắt trong thao tác đối sánh trước đó.
  • public int end(int group): Trả về chỉ mục của ký tự cuối cùng, cộng với một, của dãy con được nhóm đã cho nắm bắt trong thao tác khớp trước đó.
  • public String group(int group): Trả về dãy con đầu vào đã được thu thập bởi nhóm đã cho trong quá trình khớp trước đó.

Ví dụ:

package solutions;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexTest1 {
  public static void main(String[] args) {
    Pattern pattern1 = Pattern.compile("((X)(Y(Z)))");
    Matcher matcher1 = pattern1.matcher("((X)(Y(Z)))");
    System.out.printf("Group count is: %d", matcher1.groupCount());
  }
}

Tham chiếu ngược

Phần của chuỗi đầu vào khớp với nhóm thu thập được lưu vào bộ nhớ để gọi lại sau này thông qua tham chiếu ngược. Một tham chiếu ngược được chỉ định trong biểu thức chính quy dưới dạng dấu gạch chéo ngược (\) theo sau là một chữ số cho biết số nhóm được gọi lại. Ví dụ: biểu thức (\d\d) xác định một nhóm thu thập khớp với hai chữ số liên tiếp, có thể được gọi lại sau này trong biểu thức thông qua tham chiếu ngược \1.

Để khớp với 2 chữ số bất kỳ, theo sau là hai chữ số giống nhau, bạn sẽ sử dụng (\d\d)\1 làm biểu thức chính quy:

Enter your regex: (\d\d)\1
Enter input string to search: 1212
I found the text "1212" starting at index 0 and ending at index 4.

Nếu thay đổi 2 số cuối thì việc so khớp sẽ không đúng nữa:

Enter your regex: (\d\d)\1
Enter input string to search: 1234
No match found.

Đối với các nhóm thu thập lồng nhau thì tham chiếu ngược cũng làm việc tương tự: Xác định một dấu gạch chéo ngược theo sau bới các nhóm được gọi lại.

» Tiếp: So khớp ranh giới
« Trước: Bộ định lượng (Quantifier)
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!