String.contains
String.containshoạt động với Chuỗi, dấu chấm. Nó không hoạt động với regex. Nó sẽ kiểm tra xem Chuỗi chính xác được chỉ định có xuất hiện trong Chuỗi hiện tại hay không.
Lưu ý rằng String.containskhông kiểm tra ranh giới từ; nó chỉ đơn giản là kiểm tra chuỗi con.
Giải pháp Regex
Regex mạnh hơn String.contains, vì bạn có thể thực thi ranh giới từ trên các từ khóa (trong số những thứ khác). Điều này có nghĩa là bạn có thể tìm kiếm các từ khóa dưới dạng các từ , thay vì chỉ các chuỗi con .
Sử dụng String.matchesvới regex sau:
"(?s).*\\bstores\\b.*\\bstore\\b.*\\bproduct\\b.*"
RAW regex (loại bỏ thoát được thực hiện trong chuỗi ký tự - đây là những gì bạn nhận được khi in ra chuỗi ở trên):
(?s).*\bstores\b.*\bstore\b.*\bproduct\b.*
Các \bkiểm tra cho ranh giới từ, vì vậy mà bạn không có được một trận đấu cho restores store products. Lưu ý rằng stores 3store_productcũng bị từ chối, vì chữ số và _được coi là một phần của một từ, nhưng tôi nghi ngờ trường hợp này xuất hiện trong văn bản tự nhiên.
Vì ranh giới từ được kiểm tra cho cả hai bên, regex ở trên sẽ tìm kiếm các từ chính xác. Nói cách khác, stores stores productsẽ không khớp với regex ở trên, vì bạn đang tìm kiếm từ storemà không có s.
.thường khớp với bất kỳ ký tự nào ngoại trừ một số ký tự dòng mới . (?s)ở phần đầu, làm cho .khớp với bất kỳ nhân vật nào mà không có ngoại lệ (cảm ơn Tim Pietzcker đã chỉ ra điều này).
(?s)vào đầu regex của mình trong trường hợp chuỗi chứa các dòng mới.