web-dev-qa-db-ja.com

JavaのString.contains()メソッドで正規表現を使用する方法

文字列に「stores」、「store」、「product」の順に単語が含まれているかどうかを確認したい。それらの間に何があっても。

someString.contains(stores%store%product);.contains("stores%store%product");を使用してみました

正規表現を明示的に宣言してメソッドに渡す必要がありますか、または正規表現をまったく渡すことができませんか?

95
vipin8169

String.contains

String.containsは、文字列、ピリオドで動作します。正規表現では機能しません。指定された正確な文字列が現在の文字列に表示されるかどうかを確認します。

String.containsはWordの境界をチェックしないことに注意してください。部分文字列をチェックするだけです。

正規表現ソリューション

正規表現は、String.containsよりも強力です。これは、キーワードに(特に)単語の境界を適用できるためです。これは、substringsではなく、wordsとしてキーワードを検索できることを意味します。

次の正規表現でString.matchesを使用します。

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

RAW正規表現(文字列リテラルで行われたエスケープを削除します-これは、上記の文字列を印刷したときに得られるものです):

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

\bはWordの境界をチェックするため、restores store productsに一致するものは得られません。数字とstores 3store_productはWordの一部とみなされるため、_も拒否されることに注意してください。

両側で単語の境界がチェックされるため、上記の正規表現は正確な単語を検索します。つまり、storeなしでWord sを検索しているため、stores stores productは上記の正規表現と一致しません。

.は通常、任意の文字に一致しますexcept多数の改行文字 。最初の(?s)は、.を例外なくすべての文字に一致させます(これを指摘してくれたTim Pietzckerに感謝します)。

109
nhahtdh

matcher.find()は必要なことを行います。例:

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

Stringクラスのmatchesメソッドを使用するだけです。

boolean result = someString.matches("stores.*store.*product.*");
16
san1deep2set3hi
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.結果:true

1
Ar maj

文字列に部分文字列が含まれているかどうか、または正規表現を使用していないかどうかを確認する場合は、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.

Matches()とfind()の違いに注意してください。matchs()は、文字列全体が指定されたパターンに一致する場合にtrueを返します。 find()は、指定された入力文字列のパターンに一致する部分文字列を見つけようとします。また、find()を使用することにより、正規表現パターンの先頭に-(?s)。*や末尾に。*のような追加のマッチングを追加する必要がありません。

0
P C