文字列に「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
で単語を検索しているため、上記の正規表現には一致しません。store
s
.
通常、改行文字を除く 任意の文字に一致します。最初のmake は、例外なく任意の文字に一致します (これを指摘してくれた Tim Pietzcker に感謝します)。(?s)
.
matcher.find()
必要なことを行います。例:
Pattern.compile("stores.*store.*product").matcher(someString).find();
matches
String クラスのメソッドをそのまま使用できます。
boolean result = someString.matches("stores.*store.*product.*");
Java 11の時点で、Pattern#asMatchPredicate
which 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 述語との連鎖を可能にします。これは、 Predicate
offers 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