文字列に「stores」、「store」、「product」という単語がこの順序で含まれているかどうかを確認したいと思います。
someString.contains(stores%store%product);私も使ってみました.contains("stores%store%product");
正規表現を明示的に宣言してメソッドに渡す必要がありますか、それとも正規表現をまったく渡さないようにすることはできますか?
String.contains文字列、ピリオドで動作します。正規表現では機能しません。指定された正確な文字列が現在の文字列に表示されるかどうかを確認します。
String.containsは単語境界をチェックしないことに注意してください。部分文字列をチェックするだけです。
String.contains正規表現は、(とりわけ) キーワードに単語境界を適用できるため、よりも強力です。これは、部分文字列だけでなく単語としてキーワードを検索できることを意味します。
String.matches次の正規表現で使用します。
"(?s).*\\bstores\\b.*\\bstore\\b.*\\bproduct\\b.*"
RAW 正規表現 (文字列リテラルで行われたエスケープを削除します。これは、上記の文字列を出力したときに得られるものです):
(?s).*\bstores\b.*\bstore\b.*\bproduct\b.*
は\b単語境界をチェックするため、 に一致するものはありませんrestores store products。数字の とは単語の一部と見なされるstores 3store_productため、 も拒否されることに注意してください。ただし、このケースが自然なテキストに現れるとは思えません。_
単語境界は両側でチェックされるため、上記の正規表現は正確な単語を検索します。つまり、なしstores stores productで単語を検索しているため、上記の正規表現には一致しません。stores
.通常、改行文字を除く 任意の文字に一致します。最初のmake は、例外なく任意の文字に一致します (これを指摘してくれた Tim Pietzcker に感謝します)。(?s).
matcher.find()必要なことを行います。例:
Pattern.compile("stores.*store.*product").matcher(someString).find();
matchesString クラスのメソッドをそのまま使用できます。
boolean result = someString.matches("stores.*store.*product.*");
Java 11の時点で、Pattern#asMatchPredicatewhich returnsを使用できますPredicate<String>。
String string = "stores%store%product";
String regex = "stores.*store.*product.*";
Predicate<String> matchesRegex = Pattern.compile(regex).asMatchPredicate();
boolean match = matchesRegex.test(string); // true
このメソッドは、他の String 述語との連鎖を可能にします。これは、 Predicateoffers and、orおよびメソッドである限り、このメソッドの主な利点ですnegate。
String string = "stores$store$product";
String regex = "stores.*store.*product.*";
Predicate<String> matchesRegex = Pattern.compile(regex).asMatchPredicate();
Predicate<String> hasLength = s -> s.length() > 20;
boolean match = hasLength.and(matchesRegex).test(string); // false