Biểu thức chính quy \ s và \ s + trong Java

1. Khái quát chung

Thay thế chuỗi là một hoạt động tiêu chuẩn khi chúng tôi xử lý chuỗi trong Java.

Nhờ phương thức ReplaceAll () tiện dụng trong lớp String , chúng ta có thể dễ dàng thay thế chuỗi bằng các biểu thức chính quy. Tuy nhiên, đôi khi các biểu thức có thể gây nhầm lẫn, ví dụ: \ s\ s +.

Trong hướng dẫn ngắn này, chúng ta sẽ xem xét sự khác biệt giữa hai biểu thức chính quy thông qua các ví dụ.

2. Sự khác biệt giữa \ s\ s +

Biểu thức chính quy \ s là một lớp ký tự được xác định trước. Nó chỉ ra một ký tự khoảng trắng duy nhất. Hãy xem lại tập hợp các ký tự khoảng trắng:

[ \t\n\x0B\f\r]

Dấu cộng + là một định lượng tham lam, có nghĩa là một hoặc nhiều lần. Ví dụ: biểu thức X + khớp với một hoặc nhiều ký tự X.

Do đó, biểu thức chính quy \ s khớp với một ký tự khoảng trắng, trong khi \ s + sẽ khớp với một hoặc nhiều ký tự khoảng trắng.

3. ReplaceAll () Với một Thay thế Không trống

Chúng ta đã tìm hiểu ý nghĩa của biểu thức chính quy \ s\ s + .

Bây giờ, chúng ta hãy xem xét phương thức ReplaceAll () hoạt động khác nhau như thế nào với hai biểu thức chính quy này.

Chúng tôi sẽ sử dụng một chuỗi làm văn bản đầu vào cho tất cả các ví dụ:

String INPUT_STR = "Text With Whitespaces! ";

Hãy thử chuyển \ s đến phương thức ReplaceAll () làm đối số:

String result = INPUT_STR.replaceAll("\\s", "_"); assertEquals("Text___With_____Whitespaces!___", result);

Phương thức ReplaceAll () tìm các ký tự khoảng trắng duy nhất và thay thế mỗi kết quả trùng khớp bằng một dấu gạch dưới. Chúng tôi có mười một ký tự khoảng trắng trong văn bản đầu vào. Vì vậy, mười một thay thế sẽ xảy ra.

Tiếp theo, hãy chuyển biểu thức chính quy \ s + vào phương thức ReplaceAll () :

String result = INPUT_STR.replaceAll("\\s+", "_"); assertEquals("Text_With_Whitespaces!_", result);

Do bộ định lượng tham lam + , phương thức ReplaceAll () sẽ so khớp với chuỗi ký tự khoảng trắng liền kề dài nhất và thay thế mỗi kết quả trùng khớp bằng một dấu gạch dưới.

Trong văn bản đầu vào của chúng tôi, chúng tôi có ba chuỗi ký tự khoảng trắng liền nhau. Do đó, mỗi điểm trong số ba sẽ trở thành dấu gạch dưới.

4. ReplaceAll () Với một Thay thế Trống

Một cách sử dụng phổ biến khác của phương thức ReplaceAll () là loại bỏ các mẫu phù hợp khỏi văn bản đầu vào. Chúng tôi thường làm điều đó bằng cách chuyển một chuỗi trống làm sự thay thế cho phương thức.

Hãy xem kết quả mà chúng ta sẽ nhận được nếu chúng ta loại bỏ các ký tự khoảng trắng bằng phương thức ReplaceAll () với biểu thức chính quy \ s :

String result1 = INPUT_STR.replaceAll("\\s", ""); assertEquals("TextWithWhitespaces!", result1);

Bây giờ, chúng ta sẽ chuyển biểu thức chính quy khác \ s + vào phương thức ReplaceAll () :

String result2 = INPUT_STR.replaceAll("\\s+", ""); assertEquals("TextWithWhitespaces!", result2); 

Bởi vì thay thế là một chuỗi rỗng, hai lệnh gọi ReplaceAll () tạo ra cùng một kết quả, mặc dù hai biểu thức chính quy có ý nghĩa khác nhau:

assertEquals(result1, result2);

Nếu chúng ta so sánh hai cuộc gọi ReplaceAll () , cuộc gọi với \ s + sẽ hiệu quả hơn. Điều này là do nó thực hiện công việc chỉ với ba thay thế trong khi lệnh gọi với \ s sẽ thực hiện mười một thay thế.

5. Kết luận

Trong bài viết ngắn này, chúng ta đã tìm hiểu về các biểu thức chính quy \ s\ s + .

Chúng ta cũng đã thấy phương thức ReplaceAll () hoạt động khác nhau như thế nào với hai biểu thức.

Như mọi khi, mã có sẵn trên GitHub.