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?
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 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).
matcher.find()
macht, was Sie brauchen. Beispiel:
Pattern.compile("stores.*store.*product").matcher(someString).find();
Sie können einfach die matches
-Methode der String-Klasse verwenden.
boolean result = someString.matches("stores.*store.*product.*");
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
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.