Java'da String.contains () yönteminde regex nasıl kullanılır


112

Bir String'in "mağazalar", "mağaza" ve "ürün" kelimelerini, aralarında ne olursa olsun, bu sırayla içerip içermediğini kontrol etmek istiyorum.

Kullanmayı denedim someString.contains(stores%store%product);ve ayrıca.contains("stores%store%product");

Açıkça bir normal ifade beyan etmem ve bunu yönteme aktarmam gerekir mi yoksa bir normal ifadeyi hiç geçemez miyim?

Yanıtlar:


125

String.contains

String.containsString, nokta ile çalışır. Normal ifadeyle çalışmaz. Belirtilen tam String'in geçerli String'de görünüp görünmediğini kontrol edecektir.

String.containsKelime sınırını kontrol etmediğini unutmayın ; sadece alt dizeyi kontrol eder.

Regex çözümü

Normal ifade, String.containsanahtar kelimelere (diğer şeylerin yanı sıra) kelime sınırı uygulayabileceğinizden daha güçlüdür . Bu, anahtar kelimeleri alt dizeler yerine sözcükler olarak arayabileceğiniz anlamına gelir .

String.matchesAşağıdaki normal ifadeyle kullanın :

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

RAW regex (dize değişmezinde yapılan kaçışları kaldırın - yukarıdaki dizeyi yazdırdığınızda elde ettiğiniz şey budur):

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

\bEğer bir eşleşme alamadım böylece kelime sınırı olup olmadığını kontrol eder, restores store products. Rakamdan dolayı stores 3store_productreddedildiğini ve _bir kelimenin parçası olarak kabul edildiğini unutmayın, ancak bu durumun doğal metinde göründüğünden şüpheliyim.

Kelime sınırı her iki taraf için de kontrol edildiğinden, yukarıdaki normal ifade tam kelimeleri arayacaktır. Başka bir deyişle, stores stores productkelimenin arıyor beri, yukarıdaki regex maç olmayacak storeolmadan s.

.normalde birkaç yeni satır karakteri dışında herhangi bir karakterle eşleşir . Başlangıçta istisnasız herhangi bir karakterle eşleşmeler yapar (bunu işaret ettiği için Tim Pietzcker'a teşekkürler).(?s).


7
(?s)Dize yeni satırlar içeriyorsa, normal ifadenizin başına eklemek isteyebilirsiniz .
Tim Pietzcker

Bunun gibi bir URL'de kontrol ediyorum
vipin8169

buradaki ilk ters eğik \\b
çizgiyi

1
@ vipin8169: String'de, \bir single belirtmek için ikiye katlamanız gerekir \, böylece RAW normal ifadesinde görüldüğü gibi \\byorumlanacaktır \b. \byukarıda açıklandığı gibi kelime sınırıyla eşleşir.
nhahtdh

".mydomain" ile eşleşmesi gerekiyorsa. dizede. o zaman normal ifadeyi nasıl güncellerdi. Benim kullanım durumum, .mydomain'i içeren "www.abc.mydomain.in.io" olup olmadığıdır. ya da değil
Manmohan Soni

111

matcher.find()ihtiyacın olanı yapar. Misal:

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

4
Bunu sevdim. Eşleştirmenin normal ifadesini aşırı karmaşık buluyorum.
Mathter

21

Sadece matchesString sınıfının yöntemini kullanabilirsiniz .

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

14
İle başlamanız gerekir, .*yoksa yalnızca ile başlayan dizelerle eşleşir stores.
shmosel

Kalıpla tüm bölgeyi eşleştirmeye çalışır. Görünüşe göre @shmosel haklı, değil mi?
Pieter De Bie

1
Eh, sadece eşleşir, ancak dizenin herhangi bir konumdaki kalıbı içerip içermediğini kontrol etmez. Bu OP'nin aradığı bir çözüm değil, regexp'i iyileştirmenizi öneririm.
Gee Bee

2

Bir dizenin alt dize içerip içermediğini veya normal ifade kullanıp kullanmadığını kontrol etmek istiyorsanız, yapabileceğiniz en yakın şey 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.

Eşleşmeler () ve find () arasındaki farka dikkat edin, eşleşmeler (), dizenin tamamı verilen kalıpla eşleşirse true değerini döndürür. find (), belirli bir girdi dizesindeki modelle eşleşen bir alt dizeyi bulmaya çalışır. Ayrıca find () kullanarak, düzenli ifade kalıbınızın başında - (? S). * Ve sonunda. * Gibi fazladan eşleşme eklemeniz gerekmez.


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. sonuç: doğru

2. sonuç: doğru


fromIndexönemsenmiyor, değil mi? contains("something", test, 5) => true
PKeidel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.