web-dev-qa-db-ja.com

文字列に配列の文字列が含まれているかどうかをテストします

文字列をテストして、配列の文字列が含まれているかどうかを確認するにはどうすればよいですか?

使用する代わりに

if (string.contains(item1) || string.contains(item2) || string.contains(item3))
119
user1060828

編集:以下は、Java 8 Streaming APIを使用した更新です。とてもきれい。それでも正規表現と組み合わせることができます。

public static boolean stringContainsItemFromList(String inputStr, String[] items) {
    return Arrays.stream(items).parallel().anyMatch(inputStr::contains);
}

また、入力タイプを配列ではなくリストに変更する場合は、items.parallelStream().anyMatch(inputStr::contains)を使用できます。

一致する文字列を返す場合は、.filter(inputStr::contains).findAny()を使用することもできます。


元のわずかに古い答え:

これは(非常に基本的な)静的メソッドです。比較文字列では大文字と小文字が区別されることに注意してください。 primitive大文字と小文字を区別しない方法は、入力文字列とテスト文字列の両方でtoLowerCase()またはtoUpperCase()を呼び出すことです。

これよりも複雑なことをする必要がある場合は、 Pattern および Matcher クラスを見て、正規表現の実行方法を学ぶことをお勧めします。それらを理解したら、それらのクラスまたはString.matches()ヘルパーメソッドを使用できます。

public static boolean stringContainsItemFromList(String inputStr, String[] items)
{
    for(int i =0; i < items.length; i++)
    {
        if(inputStr.contains(items[i]))
        {
            return true;
        }
    }
    return false;
}
149
gnomed
import org.Apache.commons.lang.StringUtils;

文字列使用率

つかいます:

StringUtils.indexOfAny(inputString, new String[]{item1, item2, item3})

見つかった文字列のインデックスを返します。見つからない場合は-1を返します。

48
renanleandrof

次のような String#matches メソッドを使用できます。

System.out.printf("Matches - [%s]%n", string.matches("^.*?(item1|item2|item3).*$"));
29
anubhava

おそらく最も簡単な方法は、配列をJava.util.ArrayListに変換することです。配列リストに入ったら、containsメソッドを簡単に活用できます。

public static boolean bagOfWords(String str)
{
    String[] words = {"Word1", "Word2", "Word3", "Word4", "Word5"};  
    return (Arrays.asList(words).contains(str));
}
20
Roy Kachouh

Java 8以上を使用する場合、 Stream API を使用してそのようなことを行うことができます。

public static boolean containsItemFromArray(String inputString, String[] items) {
    // Convert the array of String items as a Stream
    // For each element of the Stream call inputString.contains(element)
    // If you have any match returns true, false otherwise
    return Arrays.stream(items).anyMatch(inputString::contains);
}

テストするための大きなStringの大きな配列があると仮定すると、 parallel() を呼び出すことで並行して検索を開始することもできます。その場合、コードは次のようになります。

return Arrays.stream(items).parallel().anyMatch(inputString::contains); 
15
Nicolas Filotto

これを試して:

if (Arrays.asList(item1, item2, item3).contains(string))
6
Óscar López

1つの解決策は次のとおりです。

public static boolean containsAny(String str, String[] words)
{
   boolean bResult=false; // will be set, if any of the words are found
   //String[] words = {"Word1", "Word2", "Word3", "Word4", "Word5"};

   List<String> list = Arrays.asList(words);
   for (String Word: list ) {
       boolean bFound = str.contains(Word);
       if (bFound) {bResult=bFound; break;}
   }
   return bResult;
}
2
serup

バージョン3.4以降、Apache Common Lang 3は containsAny メソッドを実装しています。

1
Arthur Vaïsse

大文字と小文字を区別しない一致を探している場合は、パターンを使用します

Pattern pattern = Pattern.compile("\\bitem1 |item2\\b",Java.util.regex.Pattern.CASE_INSENSITIVE);

    Matcher matcher = pattern.matcher(input);
    if(matcher.find() ){ 

}
0
vsingh

よりグルーヴィーなアプローチは、injectmetaClassと組み合わせて使用​​することです。

私は言いたいです:

String myInput="This string is FORBIDDEN"
myInput.containsAny(["FORBIDDEN","NOT_ALLOWED"]) //=>true

そして、メソッドは次のようになります。

myInput.metaClass.containsAny={List<String> notAllowedTerms->
   notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}

将来の文字列変数にcontainsAnyが必要な場合は、オブジェクトの代わりにクラスにメソッドを追加します。

String.metaClass.containsAny={notAllowedTerms->
   notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}
0