Come utilizzare regex nel metodo String.contains () in Java


112

Voglio controllare se una stringa contiene le parole "negozi", "negozio" e "prodotto" in quest'ordine, indipendentemente da cosa si trova tra di loro.

Ho provato a usare someString.contains(stores%store%product);e anche.contains("stores%store%product");

Devo dichiarare esplicitamente una regex e passarla al metodo o non posso passare affatto una regex?

Risposte:


125

String.contains

String.containsfunziona con String, punto. Non funziona con regex. Controllerà se la stringa esatta specificata appare o meno nella stringa corrente.

Notare che String.containsnon controlla il confine di parola; controlla semplicemente la sottostringa.

Soluzione Regex

Regex è più potente di String.contains, poiché puoi applicare il confine di parola alle parole chiave (tra le altre cose). Ciò significa che puoi cercare le parole chiave come parole , anziché solo sottostringhe .

Utilizzare String.matchescon la seguente regex:

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

La regex RAW (rimuovi l'escape fatto in stringa letterale: questo è ciò che ottieni quando stampi la stringa sopra):

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

I \bcontrolli per confine di parola, in modo che non si ottiene una corrispondenza per restores store products. Nota che stores 3store_productè anche rifiutato, poiché digit e _sono considerati parte di una parola, ma dubito che questo caso appaia nel testo naturale.

Poiché il confine della parola è controllato per entrambi i lati, la regex sopra cercherà le parole esatte. In altre parole, stores stores productnon corrisponderà alla regex sopra, poiché stai cercando la parola storesenza s.

.normalmente corrisponde a qualsiasi carattere tranne un numero di caratteri di nuova riga . (?s)all'inizio fa .corrispondenze qualsiasi personaggio senza eccezioni (grazie a Tim Pietzcker per averlo fatto notare).


7
Potresti voler aggiungere (?s)all'inizio della tua regex nel caso in cui la stringa contenga nuove righe.
Tim Pietzcker

lo sto controllando in un URL come questo >> stores.nextag.com/store/4908844/product/1070625777/…
vipin8169

puoi spiegare il primo backslash qui\\b
vipin8169

1
@ vipin8169: In String, è necessario raddoppiare \per specificare un singolo \, quindi \\bverrà interpretato come \b, come si vede nella regex RAW. \bcorrisponde al confine della parola, come spiegato sopra.
nhahtdh

se è necessario che corrisponda a ".mydomain". in stringa. allora come aggiorna la regex. Il mio caso d'uso è se "www.abc.mydomain.in.io" contiene .mydomain. o no
Manmohan Soni

111

matcher.find()fa quello che ti serve. Esempio:

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

4
Ama questo. Trovo la regex di Matcher eccessivamente complicata.
Mathter

21

Puoi semplicemente usare il matchesmetodo della classe String.

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

14
È necessario iniziare con .*o corrisponderà solo alle stringhe che iniziano con stores.
shmosel

Tenta di far corrispondere l'intera regione rispetto al modello. Sembra che @shmosel abbia ragione, no?
Pieter De Bie

1
Bene, corrisponde solo ma non controlla se la stringa contiene il modello in qualsiasi posizione. Questa non è una soluzione che OP cerca, suggerisco di affinare la regexp.
Gee Bee

2

Se vuoi controllare se una stringa contiene sottostringa o non usa regex, il più vicino che puoi fare è usare 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.

Nota la differenza tra match () e find (), match () restituisce true se l'intera stringa corrisponde al modello dato. find () cerca di trovare una sottostringa che corrisponda al modello in una data stringa di input. Inoltre, utilizzando find () non è necessario aggiungere ulteriori corrispondenze come - (? S). * All'inizio e. * Alla fine del modello regex.


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.risultato: vero

2.risultato: vero


fromIndexviene ignorato, non è vero? contains("something", test, 5) => true
PKeidel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.