Cách sử dụng regex trong phương thức String.contains () trong Java


112

Tôi muốn kiểm tra xem một Chuỗi có chứa các từ "cửa hàng", "cửa hàng" và "sản phẩm" theo thứ tự đó hay không, không có vấn đề gì ở giữa chúng.

Tôi đã thử sử dụng someString.contains(stores%store%product);và cũng.contains("stores%store%product");

Tôi có cần phải khai báo rõ ràng một regex và chuyển nó vào phương thức hay tôi có thể hoàn toàn không chuyển một regex nào không?

Câu trả lời:


125

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).


7
Bạn có thể muốn thêm (?s)vào đầu regex của mình trong trường hợp chuỗi chứa các dòng mới.
Tim Pietzcker

tôi đang kiểm tra nó trong một URL như thế này >> store.nextag.com/store/4908844/product/1070625777/…
vipin8169 28/02/13

bạn có thể giải thích các dấu chéo ngược đầu tiên ở đây\\b
vipin8169

1
@ vipin8169: Trong Chuỗi, bạn cần phải nhân đôi chuỗi \để chỉ định một đơn lẻ \, vì vậy \\bsẽ được hiểu là \b, như đã thấy trong RAW regex. \bkhớp với ranh giới từ, như đã giải thích ở trên.
nhahtdh 28/02/13

nếu cần đối sánh ".mydomain." trong chuỗi. sau đó nó sẽ cập nhật regex như thế nào. Trường hợp sử dụng của tôi là liệu "www.abc.mydomain.in.io" có chứa .mydomain hay không. hay không
Manmohan Soni

111

matcher.find()làm những gì bạn cần. Thí dụ:

Pattern.compile("stores.*store.*product").matcher(someString).find();

4
Thích cái này. Tôi thấy regex của matcher quá phức tạp.
Mathter

21

Bạn có thể đơn giản sử dụng matchesphương thức của lớp String.

boolean result = someString.matches("stores.*store.*product.*");

14
Bạn cần bắt đầu bằng .*hoặc nó sẽ chỉ khớp với các chuỗi bắt đầu bằng stores.
shmosel,

Cố gắng khớp toàn bộ khu vực với mẫu. Có vẻ như @shmosel là đúng, không?
Pieter De Bie,

1
Vâng, nó chỉ khớp nhưng không kiểm tra xem chuỗi có chứa mẫu ở bất kỳ vị trí nào hay không. Đây không phải là giải pháp mà OP đang tìm kiếm, tôi khuyên bạn nên tinh chỉnh regexp.
Gee Bee

2

Nếu bạn muốn kiểm tra xem một chuỗi có chứa chuỗi con hay không bằng cách sử dụng regex, cách gần nhất bạn có thể làm là sử dụng find () -

    private static final validPattern =   "\\bstores\\b.*\\bstore\\b.*\\bproduct\\b"
    Pattern pattern = Pattern.compile(validPattern);
    Matcher matcher = pattern.matcher(inputString);
    System.out.print(matcher.find()); // should print true or false.

Lưu ý sự khác biệt giữa các so khớp () và find (), so khớp () trả về true nếu toàn bộ chuỗi khớp với mẫu đã cho. find () cố gắng tìm một chuỗi con phù hợp với mẫu trong một chuỗi đầu vào nhất định. Ngoài ra, bằng cách sử dụng find (), bạn không phải thêm các kết hợp bổ sung như - (? S). * Ở đầu và. * Ở cuối mẫu regex của bạn.


2
public static void main(String[] args) {
    String test = "something hear - to - find some to or tows";
    System.out.println("1.result: " + contains("- to -( \\w+) som", test, null));
    System.out.println("2.result: " + contains("- to -( \\w+) som", test, 5));
}
static boolean contains(String pattern, String text, Integer fromIndex){
    if(fromIndex != null && fromIndex < text.length())
        return Pattern.compile(pattern).matcher(text).find();

    return Pattern.compile(pattern).matcher(text).find();
}

1. kết quả: đúng

2. kết quả: đúng


fromIndexbị bỏ qua, phải không? contains("something", test, 5) => true
PKeidel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.