Hãy tiếp tục nghiên cứu về biểu thức chính quy. Trong bài viết này, chúng ta sẽ xem xét các lớp ký tự được xác định trước cũng như định lượng (tìm kiếm chuỗi).
Các lớp ký tự được xác định trước
API lớpPattern
chứa các lớp ký tự được xác định trước cung cấp các phím tắt thuận tiện cho các biểu thức chính quy thường được sử dụng. Trong bảng này, các cấu trúc ở cột bên trái là biểu diễn tốc ký của các biểu thức ở cột bên phải. Ví dụ: \d
có nghĩa là một số (0-9), \w
có nghĩa là bất kỳ chữ hoa hoặc chữ thường, dấu gạch dưới hoặc số). Sử dụng các lớp ký tự được xác định trước bất cứ khi nào có thể. Điều này sẽ làm cho mã của bạn dễ đọc hơn và sửa lỗi hơn. Các cấu trúc bắt đầu bằng dấu gạch chéo ngược được gọi là thoát hoặc được bảo vệ. Trong các bài viết trước, chúng ta đã nói về việc thoát các ký tự đặc biệt bằng dấu gạch chéo ngược hoặc ký hiệu \Q
và \E
sử dụng chúng làm ký tự thông thường. Nếu bạn sử dụng dấu gạch chéo ngược với các ký tự thông thường (chữ cái), thì bạn cần thoát khỏi dấu gạch chéo ngược để biểu thức biên dịch.
private final String REGEX = "\\d"; // цифра
Trong ví dụ này \d
, một biểu thức chính quy; dấu gạch chéo ngược bổ sung là cần thiết để chương trình biên dịch. Chương trình thử nghiệm của chúng tôi đọc các biểu thức chính quy trực tiếp từ bảng điều khiển, do đó không cần thêm dấu gạch chéo. Ví dụ sau đây minh họa cách sử dụng các lớp ký tự được xác định trước: Trong ba ví dụ đầu tiên, biểu thức chính quy chỉ đơn giản là " .
" (ký tự đặc biệt dấu chấm), có nghĩa là bất kỳ ký tự nào. Vì vậy, việc tìm kiếm đã thành công trong mọi trường hợp. Các ví dụ khác sử dụng các lớp ký tự được xác định trước, ý nghĩa của chúng mà chúng ta đã thảo luận trong bảng trên.
định lượng
Bộ định lượng cho phép bạn chỉ định số lần xuất hiện của một ký tự trong chuỗi. Chúng ta hãy xem xét kỹ hơn sự phức tạp của cách thức hoạt động của các bộ định lượng tham lam, lười biếng và rất tham lam. Thoạt nhìn có vẻ như các bộ định lượng X?, X?? và X?+ hoạt động theo cách tương tự: “X hiện diện một lần hoặc hoàn toàn không hiện diện”. Có một số khác biệt nhỏ trong việc triển khai các bộ định lượng này mà chúng ta sẽ xem xét bên dưới.Trận đấu có độ dài bằng 0
Hãy bắt đầu với người tham lam. Hãy viết ba biểu thức chính quy khác nhau: chữ cái “a” với các ký tự đặc biệt ?, * hoặc +. Hãy xem điều gì sẽ xảy ra nếu chúng ta kiểm tra các biểu thức chính quy này trên một dòng trống: Trong ví dụ trên, việc tìm kiếm thành công trong hai trường hợp đầu tiên, vì các biểu thức a? và a* cho phép thiếu ký tự a trong chuỗi. Cũng lưu ý rằng chỉ số trận đấu bắt đầu và trận đấu cuối cùng giống nhau (0). Vì chuỗi đầu vào không có độ dài nên chương trình không tìm thấy gì :) ở vị trí đầu tiên. Trường hợp này được gọi là trận đấu có độ dài bằng 0. Sự trùng khớp như vậy xảy ra trong một số trường hợp: khi dòng đầu vào trống, ở đầu dòng đầu vào, sau ký tự cuối cùng của dòng hoặc giữa các ký tự trong dòng. Rất dễ nhận thấy các trận đấu có độ dài bằng 0: chúng bắt đầu và kết thúc ở cùng một vị trí. Hãy xem xét thêm một số ví dụ về các kết quả khớp có độ dài bằng 0. Hãy cùng khám phá các kết quả có độ dài bằng 0 bằng một vài ví dụ khác. Hãy thay đổi chuỗi đầu vào thành ký tự "a" và quan sát một hiệu ứng thú vị: Cả ba bộ định lượng đều tìm thấy ký tự "a", nhưng hai bộ định lượng đầu tiên, cho phép thiếu ký tự, đã tìm thấy kết quả khớp có độ dài bằng 0 ở vị trí 1 - sau ký tự cuối cùng của chuỗi. Điều này xảy ra vì chương trình coi ký tự “a” là một chuỗi và “chạy” qua nó cho đến khi không còn kết quả trùng khớp nào nữa. Tùy thuộc vào bộ định lượng được sử dụng, chương trình sẽ tìm thấy hoặc không tìm thấy "không có gì" ở cuối chuỗi. Bây giờ hãy thay đổi chuỗi đầu vào thành một chuỗi gồm năm chữ cái "a": Biểu thức chính quy a? tìm thấy kết quả khớp cho từng chữ cái trong chuỗi riêng biệt. Biểu thức a* tìm thấy hai kết quả khớp: chuỗi ký tự "a"' và một kết quả khớp có độ dài bằng 0 ở vị trí 5. Và cuối cùng, biểu thức chính quy a+ chỉ tìm thấy chuỗi ký tự “a”, mà không tìm thấy “không có gì” :) Điều gì sẽ xảy ra nếu một chuỗi chứa các ký tự khác nhau được đưa vào làm đầu vào? Ví dụ: "ababaaab": Ký tự "b" ở các vị trí 1, 3 và 8 và chương trình tìm các kết quả khớp có độ dài bằng 0 tại các vị trí này. Biểu thức chính quy a? không chú ý đến “b” mà chỉ tìm kiếm sự có mặt (hoặc vắng mặt) của ký tự “a”. Nếu bộ định lượng cho phép thiếu "a", tất cả các ký tự trong chuỗi không phải "a" sẽ được hiển thị dưới dạng khớp có độ dài bằng 0. Để tìm các chuỗi có độ dài nhất định, chỉ cần xác định độ dài trong dấu ngoặc nhọn: Biểu thức chính quy a{3} tìm kiếm một chuỗi gồm ba ký tự "a". Không tìm thấy gì ở dòng đầu tiên vì không có đủ chữ a trong dòng. Ký tự thứ hai chứa 3 ký tự mà chương trình tìm thấy. Thử nghiệm thứ ba cũng tìm thấy kết quả khớp ở đầu chuỗi. Mọi thứ sau ký tự thứ 3 không thỏa mãn biểu thức chính quy, trong đoạn mã bên dưới cũng vậy và sẽ có một số kết quả khớp: Để chỉ định độ dài chuỗi tối thiểu, hãy sử dụng:Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
Trong ví dụ này, chương trình chỉ tìm thấy một kết quả khớp vì chuỗi đáp ứng yêu cầu về độ dài chuỗi tối thiểu là (3) ký tự "a". Cuối cùng, đặt độ dài chuỗi tối đa: Trong ví dụ này, trận đấu đầu tiên kết thúc ở ký tự thứ sáu. Trận đấu thứ hai chứa các ký tự sau trận đấu thứ sáu, bởi vì chúng đáp ứng yêu cầu về độ dài tối thiểu. Nếu chuỗi ngắn hơn một ký tự thì sẽ không có kết quả trùng khớp thứ hai.
GO TO FULL VERSION