web-dev-qa-db-ger.com

Verwendung von regex in der Methode String.contains () in Java

Ich möchte prüfen, ob ein String die Wörter "Stores", "Store" und "Product" in dieser Reihenfolge enthält. Egal was sich dazwischen befindet.

Ich habe versucht, someString.contains(stores%store%product); und auch .contains("stores%store%product"); zu verwenden.

Muss ich einen Regex explizit deklarieren und an die Methode weiterleiten oder kann ich überhaupt keinen Regex übergeben?

92
vipin8169

String.enthält

String.contains arbeitet mit String, Punkt. Es funktioniert nicht mit Regex. Es wird geprüft, ob der genaue angegebene String im aktuellen String angezeigt wird oder nicht.

Beachten Sie, dass String.contains nicht nach einer Word-Grenze sucht. es wird einfach nach Teilzeichenfolge gesucht.

Regex-Lösung

Regex ist leistungsfähiger als String.contains, da Sie unter anderem die Word-Begrenzung für die Schlüsselwörter erzwingen können. Dies bedeutet, dass Sie nach den Schlüsselwörtern als Wörter und nicht nur nach Teilzeichenfolgen suchen können.

Verwenden Sie String.matches mit der folgenden Regex:

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

Der RAW-Regex (Entfernen Sie das Escape-Zeichen im String-Literal - dies erhalten Sie, wenn Sie den obigen String ausdrucken):

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

\b prüft die Word-Begrenzung, sodass Sie für restores store products keine Übereinstimmung finden. Beachten Sie, dass stores 3store_product auch abgelehnt wird, da digit und _ als Teil eines Wortes betrachtet werden, aber ich bezweifle, dass dieser Fall in natürlichem Text erscheint.

Da die Wortgrenze für beide Seiten geprüft wird, sucht der obige Regex nach exakten Wörtern. Mit anderen Worten, stores stores product stimmt nicht mit dem Regex oben überein, da Sie nach dem Wort store ohne s suchen.

. entspricht normalerweise einem beliebigen Zeichen außereine Anzahl neuer Zeilenzeichen . (?s) am Anfang stimmt . mit jedem Zeichen ohne Ausnahme überein (danke an Tim Pietzcker, dass Sie darauf hingewiesen haben).

104
nhahtdh

matcher.find() macht, was Sie brauchen. Beispiel:

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

Sie können einfach die matches-Methode der String-Klasse verwenden.

boolean result = someString.matches("stores.*store.*product.*");
15
san1deep2set3hi
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. Ergebnis: wahr

2. Ergebnis: wahr

1
Ar maj

Wenn Sie prüfen möchten, ob eine Zeichenfolge einen Teilstring enthält oder kein regulärer Ausdruck verwendet, können Sie dies am nächsten tun, indem Sie find () verwenden. 

    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.

Beachten Sie den Unterschied zwischen match () und find (). Matches () gibt true zurück, wenn die gesamte Zeichenfolge dem angegebenen Muster entspricht. find () versucht einen Teilstring zu finden, der dem Muster in einer angegebenen Eingabezeichenfolge entspricht. Wenn Sie find () verwenden, müssen Sie keine zusätzlichen Übereinstimmungen wie - (? S). * Am Anfang und. * Am Ende Ihres Regex-Musters hinzufügen. 

0
P C