回答:
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
。
.
通常、改行文字を除く すべての文字に一致します。最初は例外なくすべての文字に一致します(これを指摘してくれたTim Pietzckerに感謝します)。(?s)
.
\\b
\
、1つを指定するためにを2倍にする必要がある\
ため、RAW正規表現で見られる\\b
ように\b
、として解釈されます。\b
上記で説明したように、単語の境界に一致します。
matcher.find()
必要なことを行います。例:
Pattern.compile("stores.*store.*product").matcher(someString).find();
matches
Stringクラスのメソッドを使うだけです。
boolean result = someString.matches("stores.*store.*product.*");
.*
ます。そうしないと、で始まる文字列のみに一致しますstores
。
文字列に部分文字列が含まれているかどうか、または正規表現を使用していないかどうかを確認する場合は、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.
match()とfind()の違いに注意してください。matches()は、文字列全体が指定されたパターンに一致する場合にtrueを返します。find()は、指定された入力文字列のパターンに一致する部分文字列を見つけようとします。また、find()を使用することで、正規表現パターンの最初と最後に-(?s)。*と。*のような余分なマッチングを追加する必要はありません。
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.result:true
2.result:true
fromIndex
無視されませんか?contains("something", test, 5) => true
(?s)
文字列に改行が含まれている場合は、正規表現の先頭に追加することをお勧めします。