Cara menggunakan regex dalam metode String.contains () di Java

112

Saya ingin memeriksa apakah String berisi kata-kata "toko", "toko", dan "produk" dalam urutan itu, tidak peduli apa yang ada di antaranya.

Saya mencoba menggunakan someString.contains(stores%store%product);dan juga.contains("stores%store%product");

Apakah saya perlu secara eksplisit mendeklarasikan regex dan meneruskannya ke metode atau tidak dapatkah saya mengirimkan regex sama sekali?

vipin8169
sumber

Jawaban:

125

String.contains

String.containsbekerja dengan String, titik. Itu tidak berfungsi dengan regex. Ini akan memeriksa apakah String yang ditentukan persis muncul di String saat ini atau tidak.

Perhatikan bahwa String.containstidak memeriksa batas kata; itu hanya memeriksa substring.

Solusi Regex

Regex lebih kuat daripada String.contains, karena Anda dapat menerapkan batasan kata pada kata kunci (antara lain). Ini berarti Anda dapat mencari kata kunci sebagai kata , bukan hanya substring .

Gunakan String.matchesdengan regex berikut:

"(?s).*\\bstores\\b.*\\bstore\\b.*\\bproduct\\b.*"

Regex RAW (hapus pelolosan yang dilakukan dalam string literal - inilah yang Anda dapatkan saat mencetak string di atas):

(?s).*\bstores\b.*\bstore\b.*\bproduct\b.*

The \bmemeriksa batas kata, sehingga Anda tidak mendapatkan pertandingan untuk restores store products. Perhatikan itu stores 3store_productjuga ditolak, karena digit dan _dianggap sebagai bagian dari kata, tapi saya ragu kasus ini muncul dalam teks biasa.

Karena batas kata diperiksa untuk kedua sisi, regex di atas akan mencari kata yang sama persis. Dengan kata lain, stores stores producttidak akan cocok dengan regex di atas, karena Anda mencari kata storetanpa s.

.biasanya cocok dengan karakter apapun kecuali sejumlah karakter baris baru . (?s)pada awalnya .mencocokkan karakter apa pun tanpa kecuali (terima kasih kepada Tim Pietzcker karena telah menunjukkan hal ini).

nhahtdh
sumber
7
Anda mungkin ingin menambahkan (?s)awal regex Anda jika string berisi baris baru.
Tim Pietzcker
saya memeriksanya di URL seperti ini >> stores.nextag.com/store/4908844/product/1070625777/…
vipin8169
dapatkah Anda menjelaskan garis miring terbalik pertama di sini\\b
vipin8169
1
@ vipin8169: Dalam String, Anda perlu menggandakan \untuk menentukan satu \, jadi \\bakan diartikan sebagai \b, seperti yang terlihat di RAW regex. \bcocok dengan batas kata, seperti dijelaskan di atas.
nhahtdh
jika harus cocok dengan ".mydomain." dalam string. lalu bagaimana cara memperbarui regex. Kasus penggunaan saya adalah apakah "www.abc.mydomain.in.io" mengandung .mydomain. atau tidak
Manmohan Soni
111

matcher.find()melakukan apa yang Anda butuhkan. Contoh:

Pattern.compile("stores.*store.*product").matcher(someString).find();
eugene82
sumber
4
Suka yang ini. Saya menemukan regex matcher terlalu rumit.
Mathter
21

Anda cukup menggunakan matchesmetode kelas String.

boolean result = someString.matches("stores.*store.*product.*");
san1deep2set3hi
sumber
14
Anda harus memulainya .*atau itu hanya akan mencocokkan string yang dimulai dengan stores.
shmosel
Mencoba mencocokkan seluruh kawasan dengan pola. Sepertinya @shmosel benar, bukan?
Pieter De Bie
1
Yah, itu hanya cocok tetapi tidak memeriksa apakah string berisi pola di posisi mana pun. Ini bukan solusi yang dicari OP, saya sarankan untuk memperbaiki regexp.
Gee Bee
2

Jika Anda ingin memeriksa apakah sebuah string berisi substring atau tidak menggunakan regex, hal terdekat yang dapat Anda lakukan adalah dengan menggunakan 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.

Perhatikan perbedaan antara kecocokan () dan find (), kecocokan () mengembalikan nilai true jika seluruh string cocok dengan pola yang diberikan. find () mencoba menemukan substring yang cocok dengan pola dalam string input tertentu. Juga dengan menggunakan find () Anda tidak perlu menambahkan pencocokan ekstra seperti - (? S). * Di awal dan. * Di akhir pola regex Anda.

PC
sumber
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. hasil: benar

2. hasil: benar

Ar maj
sumber
fromIndexdiabaikan, bukan? contains("something", test, 5) => true
PKeidel